桥模式理解

Cha*_*dan 7 design-patterns

我在某种程度上理解桥梁模式.我理解接口和实现的分离.它使用类似插件的实现者类,它保存派生类实现的实际逻辑.

但有人可以解释它如何允许接口和派生独立发展?如果我想向接口添加一个新方法,它必须在派生类中实现,它将修改它.

其次,必须修改客户端代码以在需要新对象时设置新的实现者.

Cla*_*dio 19

是的,Bridge模式的目的是将抽象(即接口)与实现分离,让它们独立变化.在实践中,想法是使用两个单独的层次结构而不是经典的单个层次结构.

让我们举个例子.假设您有一个Window抽象,并且您需要为每个支持的平台创建一个专门用于Window的IconWindow子类.

使用单个层次结构,您将获得:

                     Window
                       |--------------...
                   IconWindow
                       |
   -----------------------------------------------...
   |                   |                   |
XIconWindow       MSIconWindow      OSXIconWindow
Run Code Online (Sandbox Code Playgroud)

这种结构非常不方便,因为:

  • 如果要添加一个专门用于Window的新子类(例如,BitmapWindow),则必须为每个支持的平台创建一个子类(即本例中的三个子类).

  • 如果要添加支持的平台,则必须为每个现有的特化添加新的子类.

因此,最好通过以下方式解耦两个层次结构:

             imp
      Window--------------------------> WindowImp
         |                                  |
    -----------....            ---------------------------------
    |                          |              |                |
IconWindow                XWindowImp      MSWindowImp    OSXWindowImp
Run Code Online (Sandbox Code Playgroud)

WindowWindowImp是接口.IconWindow使用Window提供的方法.反过来,窗口调用imp上的相关方法.

WindowWindowImp之间的关系称为Bridge.

示例:IconWindow :: DrawBorder()使用Window :: DrawRect(),它调用imp-> DevDrawLine(),它在WindowImp中声明并在具体子类中定义(例如,在类XWindowImp中).

我的建议是阅读包含上述示例的书:设计模式 - 可重用面向对象软件的元素"(http://en.wikipedia.org/wiki/Design_Patterns).