设计模式(7) 桥接模式(BRIDGE)(一)

2014-11-24 02:55:13 · 作者: · 浏览: 3
问题聚焦: 上一节讲了对象结构型模式,其主要的思想是对象的组合。并接触了一个典型的适配器模式。 这一节再讲一个常用的桥接模式,其主要的思想是抽象部分与实现部分的分离,使得抽象部分与系统平台分离开来,从而实现可移植性。 桥接主要指抽象部分和实现部分之间的关系。
意图: 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
别名:Handle/Body

动机: 当一个抽象可能有多个实现时,通常的思路为继承出多个功能类似又各司其职的子类。 继承的方法的缺点是:抽象部分与它的实现部分过分紧密,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。 考虑下面的这个例子: 一个用户界面工具箱,可移植。同时支持X Window System和IBM的PM系统。运用继承机制,我们可以定义Window抽象类和它的两个子类XWindow与PMWindow,由它们分别实现不同系统平台上的Window界面。 这个实现的不足之处在于: 1) 扩展Window抽象使之适用于不同种类的窗口或新的系统平台很不方便。 假设Window有一个子类IconWindow专门负责图标的处理,为了支持两种平台,必须实现两个新类XIconWindow和PMIconWindow。即如果我们需要支持各种功能的组件,不得不为每种组件实现两种子类。 2)继承机制使得客户代码与平台相关。结果就是,客户代码同时也要依赖当前的平台,会使得客户代也很难移植到其他平台上去。 改进目标:客户在创建代码时,不涉及到其具体实现部分,仅仅是窗口的实现部分依赖于应用运行的平台。这样,客户代码在创建窗口时就不涉及到特定的平台了。 用桥接模式解决这个问题。
  • 将Window抽象和它的实现部分分别放在独立的类层次结构中。
  • 其中一个类层次结构针对窗口接口。
  • 另一个独立的类层次结构针对平台相关的窗口实现部分,这个类层次结构的根类为WindowImp。 对Window子类的所有操作都是用WindowImp接口中的抽象操作实现。这就将窗口的抽象与系统平台相关的实现部分分离开来。因此,我们将Window与WindowImp之间的关系称之为桥接。 \\

    适用性: 一下情况使用Bridge模式:
    • 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。如在程序运行时刻实现部分应可以被选择或者切换。
    • 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时,桥接模式使你可以对不同的抽象接口和实现部分进行组合,并分别扩充。
    • 对一个抽象的实现部分的修改应对客户不产生影响,即客户的挨骂不必重新编译。
    • 你想对客户完全隐藏抽象的实现部分,在C++中,类的表示在类接口中是可见的。
    • 想在多个对象间共享实现,但同时要求客户并不知道这一点。 结构: \
      vc+437LjtM61xLLZ1/ehozxsaT5Db25jcmV0ZUltcGxlbWVudG9yo6hYd2luZG93SW1wo6xQTVdpbmRvd0ltcKOpo7rKtc/WSW1wbGVtZW50b3K907/asqK2qNLly/y1xL7fzOXKtc/WoaMK0K3X96O6CkFic3RyYWN0aW9uvatjbGllbnS1xMfrx/PXqreiuPjL/LXESW1wbGVtZW50b3K21M/zoaMKPGJyPgoK0Ke5+6O61vfSqsu1w/fHxb3TxKPKvbXE08W14zxicj4KPHVsPgo8bGk+t9bA673Tv9q8sMbkyrXP1rK/t9ajurPpz/PA4LXEyrXP1r/J0tTU2tTL0NDKsb/MvfjQ0MXk1sOjrNK7uPa21M/zyfXWwb/J0tTU2tTL0NDKsb/MuMSx5Mv8tcTKtc/WPGxpPszhuN+/ycCps+TQ1DxsaT7Ktc/Wz7i92rbUv827p824w/cKyrXP1qO6Csq508PHxb3TxKPKvcqxo6zQ6NKq16LS4tLUz8LSu9CpzsrM4goxIL3209DSu7j2SW1wbGVtZW50b3KjutTavfbT0NK7uPbKtc/WtcTKsbryo6zDu9PQsdjSqrS0vajSu7j2s+nP87XESW1wbGVtZW50b3LA4KGjCjIgtLS9qNX9yLe1xEltcGxlbWVudG9yo7oKICAgILWxtObU2rbguPZJbXBsZW1lbnRvcsDgtcTKsbryo6zE49OmuMPTw7rO1ta3vbeoo6zU2rrOyrG6zrSmyLe2qLS0vajExNK7uPZJbXBsZW1lbnRvcsDgxNijvwogICAgyOe5+0Fic3RyYWN0aW9u1qq1wMv509C1xENvbmNyZXRlSW1wbGVtZW50b3LA4KOsy/y+zb/J0tTU2sv8tcS5udTsxvfW0LbUxuTW0LXE0ru49sDgvfjQ0Mq1wP27r6Osy/y/ydLUzai5/bSrtd24+Lm51OzG97XEss7K/ci3tqjKtcD9u6/ExNK7uPbA4KGjwe3N4tK71ta3vbeoysfK18/I0aHU8dK7uPbIscqhtcTKtc/Wo6zIu7rzuPm+3dDo0qq4xLHk1eK49sq1z9ahowogICAg0rK/ydLUtPrA7bj4we3Su7j2ttTP86Os08nL/NK7tM6+9raooaPU2ldpbmRvdy9XaW5kb3dJbXDA/dfT1tCjrM7Sw8e/ydLU0v3I69K7uPZmYWN0b3J5ttTP86OsuMO21M/ztcTOqNK71rDU8L7Nyse34tewz7XNs8a9zKi1xM+4vdqjrNXiuPa21M/z1qq1wNOmuMPOqsv508O1xMa9zKi0tL2ous7W1sDg0M21xFdpbmRvd0ltcLbUz/OjrFdpbmRvd7320OjSqs/yy/zH68fz0ru49ldpbmRvd0ltcKOstvjL/Lvht7W72NX9yLfA4NDNtcRXaW5kb3dJbXC21M/zoaPV4tbWt723qLXE09C148rHo6xBYnN0cmFjdGlvbsDgsru6zcjOus7Su7j2SW1wbGVtZXRvcsDg1rG90/Huus+howozILmyz+1JbXBsZW1lbnRvcrbUz/OjutL9yOvS/dPDvMbK/cb3u/rWxqGjCjQgssnTw7bg1ti8zLPQu/rWxqO61NpDJiM0MzsmIzQzO9bQv8nS1Mq508O24NbYvMyz0Lv61sa9q7Ppz/O907/aus3L/LXEyrXP1rK/t9a94brPxvDAtKGjCjxicj4KCrT6wuvKvsD9o7oKz8LD5rXEtPrC68q1z9bJz8PmtcRXaW5kb3cvV2luZG93SW1wtcTA/dfToaMKV2luZG93wODOqr/Nu6fTptPDs8zQ8rao0uXBy7Swv9qz6c/zwOChowo8cHJlIGNsYXNzPQ=="brush:java;">class Win