Question

J'ai passé un peu de temps sur cet exemple de modèle de pont de wikipedia , mais je ne comprends pas quel est ce modèle de pont qui tente d’expliquer.

interface DrawingAPI {
    public void drawCircle(double x, double y, double radius);
}

/** "ConcreteImplementor" 1/2 */
class DrawingAPI1 implements DrawingAPI {
   public void drawCircle(double x, double y, double radius) {
        System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius);
   }
}

/** "ConcreteImplementor" 2/2 */
class DrawingAPI2 implements DrawingAPI {
   public void drawCircle(double x, double y, double radius) {
        System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius);
   }
}

/** "Abstraction" */
interface Shape {
   public void draw();                                            // low-level
   public void resizeByPercentage(double pct);     // high-level
}

/** "Refined Abstraction" */
class CircleShape implements Shape {
   private double x, y, radius;
   private DrawingAPI drawingAPI;
   public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {
       this.x = x;  this.y = y;  this.radius = radius;
       this.drawingAPI = drawingAPI;
   }

   // low-level i.e. Implementation specific
   public void draw() {
        drawingAPI.drawCircle(x, y, radius);
   }
   // high-level i.e. Abstraction specific
   public void resizeByPercentage(double pct) {
        radius *= pct;
   }
}

/** "Client" */
class Main {
   public static void main(String[] args) {
       Shape[] shapes = new Shape[2];
       shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1());
       shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2());

       for (Shape shape : shapes) {
           shape.resizeByPercentage(2.5);
           shape.draw();
       }
   }
}

Le constructeur CircleShape de la sous-classe prend 4 arguments, dans sa méthode draw (), les 3 premiers arguments sont passés au 4ème argument, qui peut être n’importe quelle sous-classe de DrawingAPI. Cela signifie-t-il que l'utilisation d'un modèle de pont peut augmenter la flexibilité? et y at-il plus de choses que cet exemple peut nous dire?

Merci !!!!

Était-ce utile?

La solution

Un exemple plus concret pour lequel cela est utile rendra les choses plus claires. Supposons que DrawingAPI1 encapsule votre pilote graphique, alors que DrawingAPI2 fait la même chose pour votre pilote d’imprimante. DrawingAPI est alors l'API générique de votre système graphique. Il vous permet de dessiner un CircleShape sur votre moniteur et de l’imprimer sur une feuille de papier en utilisant le même code. Il vous suffit de passer aux différentes implémentations de DrawingAPI. Toutefois, si vous transmettez DrawingAPI à Shape.draw () au lieu de le transmettre au constructeur, ce sera plus flexible car vous pourrez utiliser le même graphe d’objets pour le moniteur et l’imprimante.

Autres conseils

  

Le constructeur CircleShape de la sous-classe prend 4 arguments, dans sa méthode draw (), les 3 premiers arguments sont passés au 4ème argument, qui peut être n’importe quelle sous-classe de DrawingAPI. Cela signifie-t-il que l'utilisation d'un modèle de pont peut augmenter la flexibilité? et y at-il plus de choses que cet exemple peut nous dire?

Ce n’est pas seulement la flexibilité. Le modèle Bridge dissocie l'abstraction de la mise en œuvre et les deux peuvent différer .

Etant donné que CircleShape utilise la composition pour contenir DrawingAPI sans héritage, vous pouvez remplacer l'API DrawingAPI par l'une des multiples implémentations de DrawingAPI

Les formes et CircleShape peuvent changer de manière indépendante sans dépendance à DrawingAPI .

Vous trouverez plus de détails sur le modèle de pont ci-dessous dans l'article SE, qui explique un exemple différent:

Le modèle de pont dissocie-t-il une abstraction de la mise en œuvre?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top