mode pont


Bridge est utilisé pour découpler l'abstraction et la mise en œuvre afin que les deux puissent changer indépendamment. Ce type de modèle de conception est un modèle structurel qui dissocie l'abstraction et la mise en œuvre en fournissant une structure de pont entre elles.

Ce modèle implique une interface qui agit comme un pont, rendant la fonctionnalité de la classe d'entité indépendante de la classe d'implémentation de l'interface. Les deux types de classes peuvent être structurellement modifiés sans s’influencer mutuellement.

Nous démontrons l'utilisation de Bridge Pattern à travers l'exemple suivant. Parmi eux, vous pouvez utiliser la même méthode de classe abstraite mais différentes classes d'implémentation de pont pour dessiner des cercles de couleurs différentes.

Introduction

Intention : Séparez la partie abstraite de la partie implémentation afin qu'elles puissent changer indépendamment.

Solution principale : Dans les situations où il existe de nombreux changements possibles, l'utilisation de l'héritage provoquera un problème d'explosion de classe et rendra l'expansion inflexible.

Quand utiliser : Le système de mise en œuvre peut avoir plusieurs classifications d'angles, et chaque angle peut changer.

Comment résoudre : Séparez cette classification multi-angles, laissez-les changer indépendamment et réduisez le couplage entre eux.

Code clé : La classe abstraite dépend de la classe d'implémentation.

Exemples d'application : 1. Zhu Bajie s'est réincarné du maréchal Tianpeng en cochon. Le mécanisme de la réincarnation divise le monde en deux niveaux, à savoir : l'âme et le corps. abstraction, cette dernière équivaut à la réalisation. Grâce à la délégation de fonctions, les êtres vivants appellent les fonctions d'objets physiques, permettant aux êtres vivants de faire des choix dynamiques. 2. Pour l'interrupteur mural, l'interrupteur que vous pouvez voir est abstrait et vous n'avez pas à vous soucier de la façon dont il est mis en œuvre en détail.

Avantages : 1. Séparation de l'abstraction et de la mise en œuvre. 2. Excellentes capacités d’expansion. 3. Rendre les détails de mise en œuvre transparents pour les clients.

Inconvénients : L'introduction du mode pont augmentera la difficulté de compréhension et de conception du système. Étant donné que la relation d'agrégation est établie au niveau de la couche d'abstraction, les développeurs doivent concevoir et programmer l'abstraction. .

Scénarios d'utilisation : 1. Si un système a besoin d'ajouter plus de flexibilité entre le rôle abstrait et le rôle concret des composants, évitez d'établir une relation statique entre les deux niveaux de relation d'héritage, via le En mode pont, ils peuvent établir une relation d'association au niveau de la couche abstraite. 2. Le mode pont est particulièrement adapté aux systèmes qui ne souhaitent pas utiliser l'héritage ou pour lesquels le nombre de classes système augmente fortement en raison de l'héritage multi-niveaux. 3. Une classe a deux dimensions qui changent indépendamment et les deux dimensions doivent être développées.

Remarque : Pour deux dimensions changeant indépendamment, l'utilisation du mode pont est parfaite.

Implémentation

Nous avons une interface DrawAPI implémentée sous forme de pont et une classe d'entité RedCircle qui implémente l'interface DrawAPI . Cercle Vert. Shape est une classe abstraite qui utilisera des objets de DrawAPI. BridgePatternDemo, notre classe de démonstration utilise la classe Shape pour dessiner des cercles de différentes couleurs.

bridge_pattern_uml_diagram.jpg

Étape 1

Créez une interface d'implémentation de pont.

DrawAPI.java

public interface DrawAPI {
   public void drawCircle(int radius, int x, int y);
}

Étape 2

Créez une classe d'implémentation de pont d'entité qui implémente l'interface DrawAPI.

RedCircle.java

public class RedCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: red, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}

GreenCircle.java

public class GreenCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: green, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}

Étape 3

Utiliser L'interface DrawAPI crée une classe abstraite Shape.

Shape.java

public abstract class Shape {
   protected DrawAPI drawAPI;
   protected Shape(DrawAPI drawAPI){
      this.drawAPI = drawAPI;
   }
   public abstract void draw();	
}

Étape 4

Créez une classe d'entité qui implémente l'interface Shape.

Circle.java

public class Circle extends Shape {
   private int x, y, radius;

   public Circle(int x, int y, int radius, DrawAPI drawAPI) {
      super(drawAPI);
      this.x = x;  
      this.y = y;  
      this.radius = radius;
   }

   public void draw() {
      drawAPI.drawCircle(radius,x,y);
   }
}

Étape 5

Utilisez les classes Shape et DrawAPI pour dessiner différents cercles de couleurs.

BridgePatternDemo.java

public class BridgePatternDemo {
   public static void main(String[] args) {
      Shape redCircle = new Circle(100,100, 10, new RedCircle());
      Shape greenCircle = new Circle(100,100, 10, new GreenCircle());

      redCircle.draw();
      greenCircle.draw();
   }
}

Étape 6

Vérifiez la sortie.

Drawing Circle[ color: red, radius: 10, x: 100, 100]
Drawing Circle[  color: green, radius: 10, x: 100, 100]