设计模式-07.BRIDGE(桥接)— 对象结构型模式

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
    14
    class Abstraction
    {
    Implementor implementor=null;

    public Abstraction(Implementor implementor)
    {
    this.implementor=implementor;
    }

    public void Operation()
    {
    implementor.OperationImp();
    }
    }
  • RefinedAbstraction

    1
    2
    3
    4
    5
    6
    7
    8
    class RefinedAbstraction:Abstraction
    {
    public RefinedAbstraction(Implementor implementor)
    :base(implementor)
    {

    }
    }
  • Implementor

    1
    2
    3
    4
    interface Implementor
    {
    void OperationImp();
    }
  • ConcreteImplementor

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class ConcreteImplementorA
    {
    public void OperationImp()
    {
    Console.WriteLine("ConcreteImplementorA");
    }
    }
    class ConcreteImplementorB
    {
    public void OperationImp()
    {
    Console.WriteLine("ConcreteImplementorB");
    }
    }

11 已知应用

三层架构的BLL和DAL层

12 相关模式

  • Abstract Factory 模式可以用来创建和配置一个特定的 Bridge 模式。
  • Adapter 模式用来帮助无关的类协同工作,它通常在系统设计完成后才会被使用。然而,Bridge 模式则是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。
坚持原创技术分享,您的支持将鼓励我继续创作!