前言:
写了N多年代码,知道设计模式已经有8,9年了,用过设计模式,有一些又很好的用处。但是也有一些是不应该存在的设计模式。
从这里开始:
桥接模式
1.作用:
将一个抽象与实现解耦,以便两者可以独立的变化。(摘自wiki)
2.UML
3.代码:
/** "Implementor" */ 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 BridgePattern { 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(); } } }
4.评论:
这个模式是为了模式而模式,有一个问题:
如果代码写成这个样子,会有一门课叫做《重构》等待着你,这就是挣钱的原因。都让计算机专家赚走了。
Shape已经有了完全的抽象,DrawAPI有存在的必要马?No。看不到任何的用处?写在了Draw方法中和写在DrawAPI中没有任何区别。
实际上类似而真正有用的例子是输出到外设上:比如绘制到屏幕、压感笔上。但是这里的基本原理是:屏幕和压感笔实现了一套相同的绘画API。
Shape的Draw使用了绘制API,输出到真正的设备上。
这才是真正有意义的地方。wait?我为什么觉得我们在这里:偏题了。只有对抽象的扩充,已形成新的实现。没有出现和作用所言的,二者独立变化!!!
将一个抽象与实现解耦,以便两者可以独立的变化??抽象没有一丝一毫的变化,只有现实在变化。抽象没有丝毫的变化。一旦出现这种情况。抽象进行了变化,以为着什么。抽象进行了扩充,增强了功能。但是实现依然是抽象的实现。
(这不是外观模式吗?那么桥接模式在那里?)
一旦抽象和实现解耦,意味这他们拥有着不同的含义。这个时候,进行重构吧。