Modèles de conception en Java : niveau avancé avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Modèles de conception avancés en Java : de Bridge à Visitor

\n\n

Les modèles de conception sont des solutions éprouvées aux problèmes courants d'architecture logicielle. Si les modèles de base (Singleton, Factory, Observer) sont familiers à tout développeur Java, les modèles avancés restent souvent dans l'ombre. Dans cet article, nous allons analyser trois modèles puissants : Bridge, Visitor et Memento. Vous apprendrez quand les appliquer et obtiendrez des exemples de code prêts à l'emploi en Java.

\n\n

1. Bridge (Pont) — séparer l'abstraction de l'implémentation

\n\n

Le modèle Bridge est utilisé lorsque vous devez séparer l'abstraction et son implémentation afin qu'elles puissent évoluer indépendamment. Cela est particulièrement utile lorsque vous avez plusieurs dimensions de changement (par exemple, différents types d'appareils et différentes télécommandes).

\n\n

Quand l'appliquer : lorsque vous souhaitez éviter une « explosion de classes » due à la combinaison de différentes variantes.

\n\n

Exemple : Gestion des appareils

\n\n

Imaginez que nous ayons des télécommandes (Remote) et des appareils (Device). Nous voulons qu'une seule télécommande puisse fonctionner avec différents appareils (TV, Radio).

\n\n
// Implémentation (Device)\ninterface Device {\n    void turnOn();\n    void turnOff();\n    void setVolume(int percent);\n}\n\nclass TV implements Device {\n    @Override\n    public void turnOn() { System.out.println("TV allumé"); }\n    @Override\n    public void turnOff() { System.out.println("TV éteint"); }\n    @Override\n    public void setVolume(int percent) { System.out.println("Volume TV : " + percent + "%"); }\n}\n\nclass Radio implements Device {\n    @Override\n    public void turnOn() { System.out.println("Radio allumée"); }\n    @Override\n    public void turnOff() { System.out.println("Radio éteinte"); }\n    @Override\n    public void setVolume(int percent) { System.out.println("Volume Radio : " + percent + "%"); }\n}\n\n// Abstraction (Remote)\nabstract class Remote {\n    protected Device device;\n\n    public Remote(Device device) {\n        this.device = device;\n    }\n\n    public abstract void togglePower();\n    public abstract void volumeUp();\n    public abstract void volumeDown();\n}\n\nclass BasicRemote extends Remote {\n    private boolean isOn = false;\n    private int volume = 10;\n\n    public BasicRemote(Device device) {\n        super(device);\n    }\n\n    @Override\n    public void togglePower() {\n        if (isOn) { device.turnOff(); isOn = false; }\n        else { device.turnOn(); isOn = true; }\n    }\n\n    @Override\n    public void volumeUp() {\n        volume += 5;\n        device.setVolume(volume);\n    }\n\n    @Override\n    public void volumeDown() {\n        volume -= 5;\n        device.setVolume(volume);\n    }\n}\n\n// Utilisation\npublic class BridgeDemo {\n    public static void main(String[] args) {\n        Device tv = new TV();\n        Remote remote = new BasicRemote(tv);\n        remote.togglePower(); // TV allumé\n        remote.volumeUp();    // Volume TV : 15%\n\n        Device radio = new Radio();\n        remote = new BasicRemote(radio);\n        remote.togglePower(); // Radio allumée\n        remote.volumeUp();    // Volume Radio : 15%\n    }\n}
\n\n

Avantage : nous pouvons ajouter de nouveaux types d'appareils ou de nouvelles télécommandes sans modifier le code existant. Le modèle Bridge est idéal pour les applications multiplateformes (par exemple, l'interface utilisateur sur différents systèmes d'exploitation).

\n\n

2. Visitor (Visiteur) — de nouvelles opérations sans modifier les classes

\n\n

Le modèle Visitor permet d'ajouter de nouvelles opérations à un groupe d'objets sans modifier les classes de ces objets. C'est une façon classique de contourner les limitations de la répartition unique en Java.

\n\n

Quand l'appliquer : lorsque vous avez une hiérarchie de classes stable, mais que vous ajoutez fréquemment de nouvelles opérations (par exemple, exportation vers différents formats, génération de rapports).

\n\n

Exemple : Exportation de formes vers différents formats

\n\n

Nous avons des formes

Blogs

Book Recommendations