Aller au contenu principal

Héritage et composition

Progression

#Héritage, interfaces et composition

Passer par extends pour partager du code est tentant : on écrit moins et l’on bénéficie de la structure offerte par la classe parente. Pourtant, l’héritage met en place un contrat rigide. Si la relation « est‑un » se fissure, toute la hiérarchie devient fragile. Cette section s’attache à montrer quand l’héritage reste pertinent (par exemple pour spécialiser une collection déjà prévue par le JDK) et, surtout, comment la composition peut souvent offrir un couplage plus souple. Nous construisons pas à pas une hiérarchie de moyens de paiement pour illustrer les compromis : classes abstraites pour le code commun, composition d’objets stratégiques pour les règles métier qui évoluent souvent.

#Interfaces fonctionnelles et mixins légers

Java 8 a rendu les interfaces beaucoup plus expressives grâce aux méthodes par défaut. On peut désormais capturer des comportements transverses sous forme de mixins réutilisables. Dans les exemples ci-dessous, nous encapsulons une logique de retry générique qui peut se greffer sur plusieurs services sans multiplier les classes abstraites.

javajava
1public interface Retriable {2    int maxAttempts();3 4    default <T> T retry(Supplier<T> supplier) {5        int attempts = 0;6        while (true) {7            try {8                return supplier.get();9            } catch (TransientException e) {10                if (++attempts >= maxAttempts()) throw e;11                Thread.sleep(Duration.ofMillis(100));12            }13        }14    }

Une classe métier peut composer plusieurs interfaces (Retriable, Auditable, etc.) sans multiplier les super classes.

#Patterns : State, Strategy, Template Method

Une fois l’arsenal interfaces/composition maîtrisé, les patrons de conception retrouvent leur sens. Nous revisitons State en transformant un automate de gestion de commandes : au lieu d’un switch tentaculaire, chaque état devient un objet autonome plus facile à tester. Le patron Strategy est mis en œuvre sur un moteur d’ordonnancement où l’on injecte la politique de priorisation. Enfin, Template Method nous sert à factoriser la logique d’import de fichiers tout en laissant chaque format définir ses particularités. L’objectif n’est pas de réciter le GoF mais de comprendre comment ces patrons s’appuient sur les fonctionnalités modernes du langage.

#Atelier

  • Refactorez une hiérarchie Vehicle -> Car/Truck pour remplacer les instanceof par une double distribution (Visitor).
  • Concevez une bibliothèque Pipeline qui compose plusieurs stratégies de validation.