一. 简述
将抽象部分与它的实现部分分离,使他们可以独立地变化。
属于结构型模式。
二. 组成
- 抽象化(Abstraction)角色:定义抽象类的接口并保存一个对实现化对象的引用。
- 修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
- 实现化(Implementor)角色:定义实现类的接口,不给出具体的实现。此接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以完全不同。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
- 具体实现化(Concrete Implementor)角色:实现实现化角色接口并定义它的具体实现。
三. UML类图
四. 基本代码
//实现部分的抽象
public abstract class Drawing {
public abstract void drawLine();
public abstract void drawCircle();
}
public class V1Drawing extends Drawing {
@Override
public void drawCircle() {
System.out.println("使用V1Drawing画圆");
}
@Override
public void drawLine() {
System.out.println("使用V1Drawing画线");
}
}
public class V2Drawing extends Drawing{
@Override
public void drawCircle() {
System.out.println("使用V2Drawing画圆");
}
@Override
public void drawLine() {
System.out.println("使用V2Drawing画线");
}
}
public abstract class Shape {
protected Drawing myDrawing;
abstract public void draw();
Shape(Drawing drawing) {
myDrawing = drawing;
}
public void drawLine() {
myDrawing.drawLine();
}
public void drawCircle() {
myDrawing.drawCircle();
}
}
public class Circle extends Shape{
Circle(Drawing drawing) {
super(drawing);
}
@Override
public void draw() {
myDrawing.drawCircle();
}
}
public class Rectangle extends Shape {
Rectangle(Drawing drawing) {
super(drawing);
}
@Override
public void draw() {
myDrawing.drawLine();
myDrawing.drawLine();
drawLine();
}
}
//测试类
public class BridgeClient {
public static void main(String args[]) {
Drawing draw1 = new V1Drawing();
Drawing draw2 = new V2Drawing();
Shape shape1 = new Rectangle(draw1);
shape1.draw();
Shape shape2 = new Circle(draw2);
shape2.draw();
Shape shape3 = new Circle(draw1);
shape3.draw();
}
}
五. 优缺点
优点:
- 分离接口及其实现部分:将Abstraction与Implementor分离有助于降低对实现部分编译时刻的依赖性;接口与实现分离有助于分层,从而产生更好的结构化系统。
- 提高可扩充性;
- 实现细节对客户透明。
六. 应用场景
- 如果一个系统需要在构件的抽象化和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
- 设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
- 一个构件有多于一个的抽象化角色和实现化角色,并且系统需要它们之间进行动态的耦合。
- 虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。