桥接模式详解
桥接模式是一种结构型设计模式,它将一个大类或一系列紧密相关的类分为两个独立的层次结构,使它们能够在不同的维度上独立变化。这种类型的设计模式属于结构型模式,它通过组合的方式将两个独立的类层次结构连接在一起,以便在两者之间进行更灵活的沟通。
1. 什么是桥接模式?
桥接模式通过将抽象部分与实现部分分离,使它们都可以独立地变化。它通过组合的方式建立两个类层次结构之间的连接,而不是通过继承。
2. 模式结构
桥接模式包含以下主要角色:
-
Abstraction(抽象类): 定义抽象类的接口,维护一个指向实现类的引用。
-
RefinedAbstraction(扩充抽象类): 扩展抽象类,通过组合方式将实现类的功能扩展到抽象类中。
-
Implementor(实现类接口): 定义实现类的接口,这个接口不一定要与抽象类的接口完全一致。
-
ConcreteImplementor(具体实现类): 实现实现类接口,并具体实现在抽象类中定义的业务逻辑。
3. 优缺点比较
优点 | 缺点 |
---|---|
将抽象和实现分离,扩展性强 | 增加了系统的理解与设计难度 |
提高了系统的可维护性 | 需要对抽象和实现部分进行独立的变化 |
遵循开闭原则 |
4. 使用场景
桥接模式通常在以下情况下使用:
- 当一个类存在两个独立变化的维度,且两个维度都需要进行扩展时。
- 当需要避免在抽象和实现之间建立静态绑定关系时,即在编译时刻固定所有的实现类。
5. 示例代码
// 1. Implementor 实现类接口
public interface Color {
String applyColor();
}
// 2. ConcreteImplementor 具体实现类
public class Red implements Color {
@Override
public String applyColor() {
return "Red";
}
}
public class Green implements Color {
@Override
public String applyColor() {
return "Green";
}
}
// 3. Abstraction 抽象类
public abstract class Shape {
protected Color color;
public Shape(Color color) {
this.color = color;
}
abstract String draw();
}
// 4. RefinedAbstraction 扩充抽象类
public class Circle extends Shape {
public Circle(Color color) {
super(color);
}
@Override
String draw() {
return "Circle drawn. " + color.applyColor();
}
}
public class Square extends Shape {
public Square(Color color) {
super(color);
}
@Override
String draw() {
return "Square drawn. " + color.applyColor();
}
}
// 5. Client 客户端
public class Client {
public static void main(String[] args) {
Color red = new Red();
Color green = new Green();
Shape redCircle = new Circle(red);
Shape greenSquare = new Square(green);
System.out.println(redCircle.draw()); // Circle drawn. Red
System.out.println(greenSquare.draw()); // Square drawn. Green
}
}
以上示例中,Color
是实现类接口,Red
和 Green
是具体实现类。Shape
是抽象类,Circle
和 Square
是扩充抽象类。客户端可以通过组合不同的实现类来创建具有不同颜色的形状,实现了抽象和实现的分离。