A Ponte exemplo Pattern
-
05-07-2019 - |
Pergunta
Eu tive passar algum tempo com este exemplo padrão Bridge de wikipedia , no entanto, eu ainda não entendem o que é esse padrão ponte tentando explicar.
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(); } } }
O CircleShape construtor subclasse leva 4 args, no seu método de desenho (), os primeiros 3 args são passados ??para a quarta ARG, que pode ser de qualquer subclasse de DrawingAPI. Então, isso significa que o uso padrão de ponte pode aumentar a flexibilidade? e existem mais coisas este exemplo pode nos dizer?
Graças !!!!
Solução
Um exemplo mais concreto por que isso é útil irá torná-lo mais claro. Suponha DrawingAPI1 encapsula o driver de gráficos, enquanto DrawingAPI2 faz a mesma coisa para o seu driver de impressora. Então DrawingAPI é a API genérica para o seu sistema de gráficos. Ele permite que você desenhe um CircleShape ao seu monitor e imprimi-lo em um pedaço de papel com o mesmo código, você só tem que passar nas diferentes implementações DrawingAPI. No entanto, se você passar DrawingAPI em Shape.draw () em vez de passá-lo para o construtor que seria mais flexível, porque então você pode usar o mesmo gráfico de objeto para o monitor e impressora.
Outras dicas
O CircleShape construtor subclasse leva 4 args, no seu método de desenho (), os primeiros 3 args são passados ??para a quarta ARG, que pode ser de qualquer subclasse de DrawingAPI. Então, isso significa que o uso padrão de ponte pode aumentar a flexibilidade? e existem mais coisas este exemplo pode nos dizer?
Não é só a flexibilidade. O padrão Bridge desacopla abstração da implementação e ambos podem variar de forma diferente .
Desde CircleShape
usa composição para conter DrawingAPI
com-out herança, você pode substituir DrawingAPI
API com qualquer uma das várias implementações de DrawingAPI
Shape
e CircleShape
pode mudar de forma independente, sem dependência de DrawingAPI
.
Você pode encontrar mais detalhes sobre padrão Bridge em abaixo SE post, o que explica exemplo diferente: