意图
将抽象部分与其显示部分分离,使他们都可以独立地变化。
结构
其中:
- Abstraction定义抽象类的接口,维护一个指向Implementer类型对象的指针。
- RefinedAbstraction扩展由Abstraction定义的接口。
- Implementor定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同,一般来说,Implementor接口仅提供基本操作,而Abstraction定义了基于这些基本操作的较高层次的操作。
- ConcreteImplementor实现Implementor接口并定义他的具体实现
适用性
- 不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
- 累的抽象以及他的实现都有该可以通过生成子类的方法来加以扩充。这是Bridge模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译,(C++)相对客户完全隐藏抽象的实现部分。
- 许多类需要生成的层次结构。
- 想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
代码示例
桥接设计模式是一种结构型设计模式,它将抽象部分与实现部分分离,从而使两者可以独立变化。
假设我们有一个 Shape
抽象类,它定义了形状的基本操作。我们还有两个实现类 Circle
和 Square
,它们提供了具体形状的实现。
我们希望能够在不修改 Shape
抽象类的情况下向系统添加新的形状。
// 抽象形状类
abstract class Shape {
protected DrawAPI drawAPI;
protected Shape(DrawAPI drawAPI) {
this.drawAPI = drawAPI;
}
public abstract void draw();
}
// 圆形类
class Circle extends Shape {
public Circle(DrawAPI drawAPI) {
super(drawAPI);
}
@Override
public void draw() {
drawAPI.drawCircle();
}
}
// 正方形类
class Square extends Shape {
public Square(DrawAPI drawAPI) {
super(drawAPI);
}
@Override
public void draw() {
drawAPI.drawSquare();
}
}
// 绘制 API 接口
interface DrawAPI {
void drawCircle();
void drawSquare();
}
// 红色绘制 API 实现
class RedDrawAPI implements DrawAPI {
@Override
public void drawCircle() {
System.out.println("使用红色绘制圆形");
}
@Override
public void drawSquare() {
System.out.println("使用红色绘制正方形");
}
}
// 绿色绘制 API 实现
class GreenDrawAPI implements DrawAPI {
@Override
public void drawCircle() {
System.out.println("使用绿色绘制圆形");
}
@Override
public void drawSquare() {
System.out.println("使用绿色绘制正方形");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
DrawAPI redDrawAPI = new RedDrawAPI();
DrawAPI greenDrawAPI = new GreenDrawAPI();
Shape redCircle = new Circle(redDrawAPI);
Shape greenSquare = new Square(greenDrawAPI);
redCircle.draw();
greenSquare.draw();
}
}
Shape
是一个抽象类,定义了形状的基本操作。Circle
和Square
是实现类,它们提供了具体形状的实现。DrawAPI
是一个接口,定义了绘制形状所需的接口。RedDrawAPI
和GreenDrawAPI
是DrawAPI
接口的实现,它们提供了使用不同颜色的绘制功能。- 客户端代码通过将
Shape
对象与DrawAPI
对象关联来创建不同的形状和颜色组合。
桥接模式将抽象部分(Shape
)与实现部分(DrawAPI
)分离,从而使两者可以独立变化。我们可以轻松地添加新的形状或绘制 API 实现,而无需修改其他部分。