1 意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
2 别名
Handle/Body
3 动机
当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。继承机制有两个不足之处:
1) 扩展抽象使之适用于不同种类的窗口或新的系统平台很不方便。
2) 继承机制使得客户代码与平台相关。
4 适用性
- 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。 例如在程序运行时刻实现部分应可以被选择或者切换。
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时 Bridge 模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
- (C++)你想对客户完全隐藏抽象的实现部分。在 C++ 中,类的表示在类接口中是可见的。
- 正如在意图一节的第一个类图中所示的那样,有许多类要生成。这样一种类层次结构说明你必须将一个对象分解成两个部分。
- 你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
5 结构
6 参与者
- Abstraction(Window)
- 定义抽象类的接口。
- 维护一个指向 Implementor 类型对象的指针。
- RefinedAbstraction(IconWindow)
- 扩充由 Abstraction 定义的接口。
- Implementor(WindowImp)
- 定义实现类的接口,该接口不一定要与 Abstraction 的接口完全一致;事实上这两个接口可以完全不同。一般来讲,Implementor 接口仅提供基本操作,而 Abstraction 则定义了基于这些基本操作的较高层次的操作。
- ConcreteImplementor(XwindowImp,PMWindowImp)
- 实现 Implementor 接口并定义它的具体实现。
7 协作
Abstraction 将 client 的请求转发给它的 Implementor 对象。
8 效果
- 分离接口及其实现部分
- 提高可扩充性
- 实现细节对客户透明
9 实现
- 仅有一个 Implementor在仅有一个实现的时候,没有必要创建一个抽象的 Implementor 类。这是 Bridge 模式的退化情况;在 Abstraction 与 Implementor 之间有一种一对一的关系。尽管如此,当你希望改变一个类的实现不会影响已有的客户程序时,模式的分离机制还是非常有用的—也就是说,不必重新编译它们,仅需重新连接即可。
- 创建正确的 Implementor 对象
- 如果 Abstraction 知道所有的 ConcreteImplementor 类,它就可以在它的构造器中对其中的一个类进行实例化,它可以通过传递给构造器的参数确定实例化哪一个类。
- 首先选择一个缺省的实现,然后根据需要改变这个实现。
- 代理给另一个对象,由它一次决定。
- 共享 Implementor 对象多个对象间共享一些实现,有一个对象引用计数器,并对它进行增减操作。
- 采用多重继承机制C#不支持,不考虑
10 代码示例
Abstraction
1
2
3
4
5
6
7
8
9
10
11
12
13
14class Abstraction
{
Implementor implementor=null;
public Abstraction(Implementor implementor)
{
this.implementor=implementor;
}
public void Operation()
{
implementor.OperationImp();
}
}RefinedAbstraction
1
2
3
4
5
6
7
8class RefinedAbstraction:Abstraction
{
public RefinedAbstraction(Implementor implementor)
:base(implementor)
{
}
}Implementor
1
2
3
4interface Implementor
{
void OperationImp();
}ConcreteImplementor
1
2
3
4
5
6
7
8
9
10
11
12
13
14class ConcreteImplementorA
{
public void OperationImp()
{
Console.WriteLine("ConcreteImplementorA");
}
}
class ConcreteImplementorB
{
public void OperationImp()
{
Console.WriteLine("ConcreteImplementorB");
}
}
11 已知应用
三层架构的BLL和DAL层
12 相关模式
- Abstract Factory 模式可以用来创建和配置一个特定的 Bridge 模式。
- Adapter 模式用来帮助无关的类协同工作,它通常在系统设计完成后才会被使用。然而,Bridge 模式则是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。