Пример паттерна моста - PullRequest
       37

Пример паттерна моста

5 голосов
/ 27 ноября 2009

Я потратил некоторое время на этот пример паттерна моста из википедии , однако я до сих пор не понимаю, что пытается объяснить этот паттерн моста.

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();
       }
   }
}

Конструктор подкласса CircleShape принимает 4 аргумента, в его методе draw () первые 3 аргумента передаются 4-му аргументу, который может быть любым подклассом из DrawingAPI. Значит ли это, что использование шаблона моста может увеличить гибкость? и есть ли еще что-то, что этот пример может сказать нам?

Спасибо !!!!

Ответы [ 2 ]

7 голосов
/ 27 ноября 2009

Более конкретный пример, почему это полезно, прояснит ситуацию. Предположим, DrawingAPI1 инкапсулирует ваш графический драйвер, в то время как DrawingAPI2 делает то же самое для вашего драйвера принтера. Тогда DrawingAPI - это общий API для вашей графической системы. Он позволяет нарисовать CircleShape на мониторе и распечатать его на листе бумаги, используя тот же код, вам нужно только передать различные реализации DrawingAPI. Однако, если вы передадите DrawingAPI в Shape.draw () вместо того, чтобы передавать его в конструктор, он будет более гибким, поскольку тогда вы сможете использовать один и тот же граф объектов для монитора и принтера.

0 голосов
/ 10 июля 2016

Конструктор подкласса CircleShape принимает 4 аргумента, в его методе draw () первые 3 аргумента передаются в 4-й аргумент, которым может быть любой подкласс из DrawingAPI. Значит ли это, что использование шаблона моста может увеличить гибкость? и есть ли еще что-то, что этот пример может рассказать нам?

Это не только гибкость. Шаблон Bridge отделяет абстракцию от реализации, и оба могут различаться .

Поскольку CircleShape использует композицию для хранения DrawingAPI без наследования, вы можете заменить DrawingAPI API любой из нескольких реализаций DrawingAPI

Shape и CircleShape могут изменяться независимо, независимо от DrawingAPI.

Вы можете найти более подробную информацию о паттерне Bridge в следующем посте SE, который объясняет другой пример:

Отражает ли паттерн моста абстракцию от реализации?

...