桥接模式:
桥接模式(Bridge Pattern)是一种结构型类型的设计模式,它将抽象部分与其实现部分分离,使它们可以独立变化。这种模式通过创建一个抽象类和实现类之间的桥接层来达到解耦的目的,允许在不修改原有接口的情况下扩展或更换实现。
角色和结构:
1 Abstraction(抽象类):
- 定义了抽象类的接口,保存并维护对实现类对象的引用。
- 通常包含一些基本操作,并委托给实现类完成具体工作。
2 Refined Abstraction(扩展抽象类):
- 是Abstraction的一个子类,可能会添加额外的功能或者改变父类定义的行为。
3 Implementor(实现接口/抽象实现类):
- 定义实现类需要实现的接口,包含各种可选的方法声明。
- 不知道任何关于Abstraction层次结构的信息。
4 Concrete Implementor(具体实现类):
- 实现Implementor接口的具体类,提供了实现接口所要求的各种方法的实际代码。
工作原理:
- 抽象类定义了一个接口,而实现类则提供不同的实现方式。
- 桥接模式的核心在于分离抽象和实现两个维度的变化,让这两个维度可以独立地进行扩展和复用。
示例代码
桥接模式java示例代码:
// 实现接口
interface DrawingAPI {
void drawCircle(double x, double y, double radius);
}
// 具体实现类
class DrawingAPI1 implements DrawingAPI {
@Override
public void drawCircle(double x, double y, double radius) {
// 实现画圆形的逻辑1
}
}
class DrawingAPI2 implements DrawingAPI {
@Override
public void drawCircle(double x, double y, double radius) {
// 实现画圆形的逻辑2
}
}
// 抽象类
abstract class Shape {
protected DrawingAPI drawingAPI;
public Shape(DrawingAPI drawingAPI) {
this.drawingAPI = drawingAPI;
}
abstract void draw();
}
// 扩展抽象类
class CircleShape extends Shape {
private double x, y, radius;
public CircleShape(DrawingAPI drawingAPI, double x, double y, double radius) {
super(drawingAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
@Override
void draw() {
drawingAPI.drawCircle(x, y, radius);
}
}
// 客户端代码
public class BridgePatternDemo {
public static void main(String[] args) {
Shape circle1 = new CircleShape(new DrawingAPI1(), 10, 10, 5);
Shape circle2 = new CircleShape(new DrawingAPI2(), 15, 15, 8);
circle1.draw(); // 使用DrawingAPI1绘制圆
circle2.draw(); // 使用DrawingAPI2绘制圆
}
}
优点:
- 将抽象与实现分离,提高了系统的灵活性和可扩展性。
- 减少类间的耦合,方便替换底层实现。
- 支持多维度的变化,每个维度都可独立变化而不影响其他维度。
应用场景:
- 当系统中存在两个独立变化的维度时,如图形界面中形状和颜色可以独立变化。
- 需要使用多种不同实现的同一抽象接口,并且客户程序仅依赖于抽象接口时。