说明
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。
一个事物我们可以从不同的维度去描述它,在众多维度中我们需要确定一个主维度,即其他副维度是描述主维度的。在桥接模式中,我们需要将主维度抽象化,副维度接口化,使他们能够独立的变化。
举栗说明:
扩展\维度 | 形状 | 颜色 |
---|---|---|
扩展一 | 正方形 | 白色 |
扩展二 | 圆形 | 黑色 |
很显然,这两个维度有四种组合,即:
白色正方形
黑色正方形
白色圆形
黑色圆形
模式特征
角色 | 说明 | 举栗 |
---|---|---|
抽象化(Abstraction) | 抽象化给出的定义,并保存至少一个对实现化对象的引用 | Shape |
修正抽象化(Refined Abstraction) | 扩展抽象化角色,改变和修正父类对抽象化的定义 | Square、Circle |
实现化(Implementor) | 这个角色给出实现化角色的接口 | Color |
具体实现化(Concrete Implementor) | 这个角色给出实现化角色接口的具体实现 | White、Black |
UML
代码实现
- 抽象化角色:形状
public abstract class Shape {
protected Color color;
public Shape(Color color){
this.color =color;
}
//抽象方法,用于子类实现
public abstract void info();
}
- 修正抽象化角色:正方形
public class Square extends Shape {
public Square(Color color) {
super(color);
}
@Override
public void info() {
System.out.println(super.color.color() + "正方形");
}
}
- 修正抽象化角色:圆形
public class Circle extends Shape {
public Circle(Color color) {
super(color);
}
@Override
public void info() {
System.out.println(super.color.color() + "圆形");
}
}
- 实现化角色
public interface Color {
String color();
}
- 具体实现化角色:白色
public class White implements Color {
@Override
public String color() {
return "白色";
}
}
- 具体实现化角色:黑色
public class Black implements Color {
@Override
public String color() {
return "黑色";
}
}
- 客户端测试类
public class Client {
public static void main(String[] args) {
Shape circle = new Circle(new Black());
circle.info();
Shape circle1 = new Circle(new White());
circle1.info();
Shape square = new Square(new Black());
square.info();
Shape square1 = new Square(new White());
square1.info();
}
}
优缺点
优点
- 抽象和实现分离
- 易于扩展
缺点
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程