Qu'est-ce que le modèle Bridge ?
Le modèle Bridge est un modèle de conception structurelle. Autrement dit, sa tâche principale est de créer une structure complète de classes et d'objets. Bridge résout ce problème en séparant une ou plusieurs classes en hiérarchies distinctes : abstraction et implémentation . Un changement de fonctionnalité dans une hiérarchie n'entraîne pas de changement dans une autre. Tout semble clair, mais en fait cette définition semble très large et ne répond pas à la question principale : « Qu'est-ce que le modèle Bridge ? Je pense que ce sera plus facile à comprendre dans la pratique. Modélisons immédiatement un exemple classique pour le modèle Bridge. Nous avons une classe abstraiteShape
qui décrit généralement une figure géométrique :
-
Forme.java
public abstract class Shape { public abstract void draw(); }
Lorsque nous déciderons d'ajouter des formes de triangle et de rectangle, nous hériterons de la classe
Shape
: -
Rectangle.java :
public class Rectangle extends Shape { @Override public void draw() { System.out.println("Drawing rectangle"); } }
-
Triangle.java :
public class Triangle extends Shape { @Override public void draw() { System.out.println("Drawing triangle"); } }
draw()
. Pour avoir différentes implémentations de la méthode draw()
, nous devons créer une classe pour chaque forme correspondant à une couleur. S'il y a trois couleurs, alors il y a six classes : TriangleBlack
, TriangleGreen
, TriangleRed
, RectangleBlack
, RectangleGreen
et RectangleRed
. Six cours, ce n’est pas si grave. Mais! Si nous devons ajouter une nouvelle forme ou une nouvelle couleur, le nombre de classes augmentera de façon exponentielle. Comment sortir de cette situation ? Stocker les couleurs dans un champ et essayer des options via des conditions n'est pas la meilleure solution. Une bonne solution consiste à afficher la couleur dans une interface distincte . Aussitôt dit, aussitôt fait : créons une interface Color
et trois de ses implémentations - BlackColor
, GreenColor
etRedColor
:
-
Couleur.java :
public interface Color { void fillColor(); }
-
BlackColor.java :
public class BlackColor implements Color { @Override public void fillColor() { System.out.println("Filling in black color"); } }
-
CouleurVerte.java
public class GreenColor implements Color { @Override public void fillColor() { System.out.println("Filling in green color"); } }
-
CouleurRouge.java
public class RedColor implements Color { @Override public void fillColor() { System.out.println("Filling in red color"); } }
Ajoutons maintenant un champ de type
Color
à la classeShape
- nous recevrons sa valeur dans le constructeur. -
Shape.java :
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
color
Nous utiliserons la variable dans les implémentationsShape
. Cela signifie que les formes peuvent désormais utiliser les fonctionnalités de l'interfaceColor
. -
Rectangle.java
public class Rectangle extends Shape { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.println("Drawing rectangle"); color.fillColor(); } }
Color color
est un pont qui relie deux hiérarchies de classes distinctes.
Dispositif pont : qu'est-ce que l'abstraction et la mise en œuvre
Jetons un coup d'œil au diagramme de classes qui décrit le modèle Bridge : vous pouvez voir ici deux structures indépendantes qui peuvent être modifiées sans affecter les fonctionnalités de l'autre. Dans notre cas c'est :- Classe d'abstraction
Shape
; - Classes d'abstraction raffinée
Triangle
,Rectangle
; - Implémenteur - interface
Color
; - Classes ConcreteImplementor
BlackColor
etGreenColor
.RedColor
Shape
représente une Abstraction - un mécanisme permettant de contrôler la coloration des figures dans différentes couleurs, qui délègue l'implémentation à l'interface Color
. Les classes Triangle
sont Rectangle
des objets réels qui utilisent le mécanisme proposé par la classe Shape
. BlackColor
, GreenColor
et RedColor
- des implémentations spécifiques dans la branche Implémentation. On les appelle souvent une plateforme.
Où le modèle Bridge est-il utilisé ?
Un énorme avantage de l’utilisation de ce modèle est que vous pouvez apporter des modifications aux fonctionnalités des classes d’une branche sans briser la logique d’une autre. Cette approche permet également de réduire le couplage des classes de programme. La condition principale pour utiliser les patrons est de « suivre les instructions » : ne les collez nulle part ! En fait, voyons dans quels cas vous devez absolument utiliser Bridge :-
S'il est nécessaire d'augmenter le nombre d'entités dans deux directions (formes géométriques, couleurs).
-
Si vous souhaitez diviser une grande classe qui ne respecte pas le principe de responsabilité unique en classes plus petites avec des fonctionnalités à profil étroit.
-
S'il est éventuellement nécessaire d'apporter des modifications à la logique de fonctionnement de certaines entités pendant l'exécution du programme.
-
Si nécessaire, cachez l’implémentation aux clients de classe (bibliothèque).
Avantages et inconvénients du modèle
Comme d’autres modèles, le Bridge présente à la fois des avantages et des inconvénients. Avantages du pont :- Améliore l'évolutivité du code - vous pouvez ajouter des fonctionnalités sans craindre de casser quelque chose dans une autre partie du programme.
- Réduit le nombre de sous-classes - fonctionne lorsqu'il est nécessaire d'augmenter le nombre d'entités dans deux directions (par exemple, le nombre de formes et le nombre de couleurs).
- Permet de travailler séparément sur deux branches indépendantes d'abstraction et d'implémentation - cela peut être fait par deux développeurs différents sans approfondir les détails du code de chacun.
- Réduire le couplage des classes - le seul endroit où deux classes sont connectées est le pont (champ
Color color
).
- En fonction de la situation spécifique et de la structure du projet dans son ensemble, il peut y avoir un impact négatif sur la productivité du programme (par exemple, si davantage d'objets doivent être initialisés).
- Complique la lisibilité du code en raison de la nécessité de naviguer entre les classes.
GO TO FULL VERSION