设计模式 - 浅谈桥接模式
桥接模式
模式功能说明:主要解决的是类的两个独立维度的扩展。
模式思路与原理
为了解决以下场景,使用合成/聚合复用原则,可通过桥接模式实现。
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
示例
假设我们有一个形状类Shape
和颜色类Color
,形状有圆形和矩形,颜色有红色和蓝色。如果我们要创建红色的圆形和蓝色的矩形,那么就需要创建4个类,如果再增加形状或者颜色,类的数量就会呈指数级增长。这时候就可以使用桥接模式来解决这个问题。
// 定义颜色接口
interface Color {
void applyColor();
}
// 实现颜色接口的具体类
class RedColor implements Color {
public void applyColor(){
System.out.println("red.");
}
}
class BlueColor implements Color {
public void applyColor(){
System.out.println("blue.");
}
}
// 定义形状抽象类
abstract class Shape {
protected Color color;
public Shape(Color color){
this.color = color;
}
abstract public void applyColor();
}
// 实现形状抽象类的具体类
class Circle extends Shape {
public Circle(Color color) {
super(color);
}
public void applyColor() {
System.out.print("Circle filled with ");
color.applyColor();
}
}
class Square extends Shape {
public Square(Color color) {
super(color);
}
public void applyColor() {
System.out.print("Square filled with ");
color.applyColor();
}
}
// 测试
public class BridgePatternTest {
public static void main(String[] args) {
Shape circle = new Circle(new RedColor());
Shape square = new Square(new BlueColor());
circle.applyColor();
square.applyColor();
}
}
Shape类
是抽象部分,Color类
是实现部分。Shape类
有一个Color类型的成员变量,这就是桥接模式的桥接。这样,如果我们要增加新的形状或者颜色,只需要增加新的Shape子类
或者Color子类
,而不需要修改已有的类。
优缺点
优点:
- 在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法,它极大减少了子类的个数。
- 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合“开闭原则”。
缺点:
桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。