- 桥接模式(Bridge Pattern)
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
以下一些情况使用桥接模式:
- 你不希望在抽象和它的实现之间有一个固定的绑定关系。
- 类的抽象以及它们的实现都应该可以通过生成子类的方法加以补充,这时桥接模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
- (C++)你想对客户完全隐藏抽象的实现部分,在C++中,类的表示在类接口中是可见的。
- 你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
示例:
DrawingAPI.java
public interface DrawingAPI { public void drawCircle(final double x, final double y, final double radius); }
DrawingAPI1.java
public class DrawingAPI1 implements DrawingAPI { public void drawCircle(final double x, final double y, final double radius) { System.out.printf("API1.circle at %f:%f radius %f%n", x, y, radius); } }
DrawingAPI2.java
public class DrawingAPI2 implements DrawingAPI { public void drawCircle(final double x, final double y, final double radius) { System.out.printf("API2.circle at %f:%f radius %f%n", x, y, radius); } }
Shape.java
abstract class Shape { protected DrawingAPI drawingAPI; protected Shape(final DrawingAPI drawingAPI){ this.drawingAPI = drawingAPI; } public abstract void draw(); // low-level public abstract void resizeByPercentage(final double pct); // high-level }
CricleShape.java
public class CircleShape extends Shape { private double x, y, radius; public CircleShape(final double x, final double y, final double radius, final DrawingAPI drawingAPI) { super(drawingAPI); this.x = x; this.y = y; this.radius = radius; } // low-level i.e. Implementation specific public void draw() { drawingAPI.drawCircle(x, y, radius); } // high-level i.e. Abstraction specific public void resizeByPercentage(final double pct) { radius *= (1.0 + pct/100.0); } }
BridgePattern.java
public class BridgePattern { public static void main(final String[] args) { Shape[] shapes = new Shape[] { new CircleShape(1, 2, 3, new DrawingAPI1()), new CircleShape(5, 7, 11, new DrawingAPI2()) }; for (Shape shape : shapes) { shape.resizeByPercentage(2.5); shape.draw(); } } }