Aha!设计模式(51)-桥接模式(2)

2019-04-13 13:45发布

适用性
  以下一些情况使用Bridge模式: • 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。   一般来讲,抽象类定义接口,具象类负责实现,而且实现功能的代码都是直接写在对应的方法里,这就是所谓的绑定。桥接模式将实现部分独立成单独的类之后,可以简单地被替换。   • 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时Bridge 式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。   可以多个接口类使用同一个实现类,也可以一个接口类切换使用多个实现类。   • 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。   可以实现运行时替换实现类的实例,动态改变类的行为。
• (C++)你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的。   很多时候,C++的头文件或多或少的会存在一些和实现相关的数据成员,使用桥接模式之后这部分内容都被移动到实现类的具象类中,结果上隐藏了实现的细节。
• 正如在意图一节的第一个类图中所示的那样,有许多类要生成。这样一种类层次结构说明你必须将一个对象分解成两个部分。 Rumbaugh称这种类层次结构为“嵌套的普化”(nested generalizations)。   上一篇文章中作者也提到,类的功能出现了排列组合,就说明需要将实现类从接口类中分离出来了。
• 你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。 一个简单的例子便是Coplien的String类[ Cop92 ],在这个类中多个对象可以共享同一个字符串表示(StringRep)。   共享的前提当然首先要将需要共享的部分独立出来。   作者观点   《设计模式》的作者在桥接模式中反复提到抽象和实现这两个词,下面说说作者的理解。C++的第一个特性就是封装,封装的意义就是隔离接口和实现,封装就是隐藏细节,这样的描述相信读者可以很多地方看到,这里也不想展开说明。但是有几点可能需要补充一下。 首先接口类面向的是类的使用者,提供的语义也属于使用者语境,例如前文中的Window类,它提供的所有操作都是基于用户看到的Window模型的。这种接口就是桥接模式中所谓的抽象。 实现抽象功能的部分被类封装,使用者看不到。但是一般来讲,实现的代码会直接写在Window方法的内部,这就是所谓的绑定段关系。 桥接模式则是将实现部分在抽象成类,在Windows方法中调用类的接口,而真正的实现则是由实现类的派生类来完成。   注:   本文中蓝 {MOD}粗体文字都引自《设计模式》一书。 阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】   觉得本文有帮助?请分享给更多人。