定义
它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。事物对象仅是一个抽象的概念。如“圆形”、“三角形”归于抽象的“形状”之下,而“画圆”、“画三角”归于实现行为的“画图”类之下,然后由“形状”调用“画图”。-
类图
例子
/**
* "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();
}
}
}
补充
- 感觉平时用过,但又不是特别清晰,我认为的是桥接更偏向于抽象,通过接口来改变结构,通过A调用B,B来调用C,而且有一个聚合的关系。
将抽象和实现放在两个不同的类层次中,使它们可以独立地变化。——《Head First 设计模式》
将类的功能层次结构和实现层次结构相分离,使二者能够独立地变化,并在两者之间搭建桥梁,实现桥接。—— 《图解设计模式》
桥接模式、代理模式、中介者模式、适配器模式的区别
- 桥接强调『实现与抽象』分离
- 代理强调『转接』(相同事物的转接)
- 中介者强调『调和』(两个对象之间交流)
- 适配器强调『适配』(自己处理好,不是转接也不是调和)