由来
传统地,当一个抽象可能有多个实现时,通常用继承来协调它们:抽象类定义该抽象的接口,具体的子类则用不同的方式加以实现。
但是此方法有时不够灵活:继承机制将抽象部分与它的实现部分绑定,难以对抽象部分和实现部分独立地进行修改、扩充和重用。
目的
桥接模式将抽象部分与实现部分分离,使它可以独立的变化。
适用场景
- 不希望在抽象和它的实现部分之间有一个固定的绑定关系
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充
- 实现部分的修改应对客户不产生影响
- 想对客户完全隐藏抽象的实现部分
结构
角色
-
Abstraction
定义抽象类的接口
维护一个指向Implementor类型对象的指针 -
RefinedAbstraction
扩充由Abstraction定义的接口 -
Implementor
定义实现类的接口,不一定要与Abstraction的接口完全一致,甚至可以完全不同 -
ConcreteImplementor
实现Implementor接口并定义它的具体实现
效果
-
分离接口及其实现部分
抽象类的实现可以在运行时刻进行配置
一个对象甚至可以在运行时刻改变它的实现 -
提高可扩充性
抽象与实现两部分可以单独扩充 -
实现细节对客户透明
可以对客户隐藏实现细节
实例
// 图形
public abstract class AbstractShape {
Color color;
public AbstractShape(Color color) {
this.color = color;
}
public abstract void draw();
}
// 圆形
public class Circle extends AbstractShape {
public Circle(Color color) {
super(color);
}
@Override
public void draw() {
System.out.println
("使用" + color.getColor() + "画圆形");
}
}
// 正方形
public class Square extends AbstractShape {
public Square(Color color) {
super(color);
}
@Override
public void draw() {
System.out.println
("使用" + color.getColor() + "画正方形");
}
}
/ 颜色
public interface Color {
String getColor();
}
public class Red implements Color {
@Override
public String getColor() {
return "红色";
}
}
public class Green implements Color {
@Override
public String getColor() {
return "绿色";
}
}
public class Test {
public static void main(String[] args) {
Color color = new Green();
AbstractShape shape = new Square(color);
shape.draw();
}
}