1、意图
将抽象部分与实现部分分离,使它们都可以独立地变化
2、适用性
以下一些情况使用Bridge模式
(1)你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为在程序运行时刻实现部分应可以被选择或者切换。
(2)类的抽象以及它的实现部分都应该可以通过生成子类的方法加以扩充。这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
(3)对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译
(4)你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的。
3、参与者
(1)Abstraction:定义抽象类的接口;维护一个指向Implementor类型对象的指针
(2)RefinedAbstraction:扩充由Abstraction定义的接口
(3)Implementor:定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同,一般来说,Implementor接口仅提供基本操作,而Bstration则定义了基于这些操作的较高层次的操作
(4)ConcreteImplementor:实现Implemtor接口并定义它的具体实现
UML类图表示为:
java的实现代码表示为:
package javatest;
interface DrawingAPI
{
public void drawCircle(double x, double y, double radius);
}
class DrawingAPI1 implements DrawingAPI
{
@Override
public void drawCircle(double x, double y, double radius)
{
System.out.printf("api1.circle:x=%f, y=%f, radius=%f\n", x, y, radius);
}
}
class DrawingAPI2 implements DrawingAPI
{
@Override
public void drawCircle(double x, double y, double radius)
{
System.out.printf("api2.circle:x=%f, y=%f, radius=%f\n", x, y, radius);
}
}
abstract class Shape
{
protected DrawingAPI drawingApi;
protected Shape(DrawingAPI api)
{
this.drawingApi = api;
}
public abstract void drawCircle();
}
class CircleShape extends Shape
{
private double x, y, radius;
public CircleShape(double x, double y, double radius, DrawingAPI api)
{
super(api);
this.x = x; this.y = y; this.radius = radius;
}
@Override
public void drawCircle()
{
drawingApi.drawCircle(x, y, radius);
}
}
public class JavaTest
{
public static void main(String[] args)
{
Shape[] shapes = new Shape[] {new CircleShape(1, 2, 3, new DrawingAPI1()),
new CircleShape(5, 7, 11, new DrawingAPI2())};
for (Shape shape : shapes) {
shape.drawCircle();
}
}
}
4、协作
Abstraction将Client的请求转发给它的Implementor对象
5、效果
Bridge模式有以下的一些优点:
(1)分离接口及其实现部分:一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的状态。
(2)提高可扩充性:你可以独立地对Abstraction和Implementor层次结构进行扩充
(3)实现细节对客户透明:你可以对客户隐藏实现细节。
6、相关模式
AbstractFactory模式可以用来创建和配置一个特定的Bridge模式
Adapter模式用来帮助无关的类协同工作,它通常是在系统设计完成后才会被使用。然而,Bridge模式则是在系统开始时就被使用,它使得抽象接口与实现部分可以独立进行改变。