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