桥接模式的好处是什么?

12

当我想要学习新的东西时,我会问自己:如果我不学这个东西,我会失去什么。我打算学习一些设计模式,一切都很顺利。但是当我遇到桥接设计模式时,遇到了问题。实际上,我无法想象何时使用此设计模式。我知道在Google和Stackoverflow中还有其他链接,比如这篇文章

但是有没有人能够说出来,如果我们忘记了桥接设计模式并跳过尝试这个模式,我们会失去什么呢?


在我看来,这似乎是一个扩展的工厂模式。 - DevZer0
你可以查看链接描述 - mjavad latify
@mjavadlatify 我之前看过那个链接。不幸的是,它对我没有帮助。 - Seyed Morteza Mousavi
2个回答

12

桥接模式就是发现一些职责交汇在一起,然后将它们分开。我将使用《设计模式》的例子,因为我认为这是一个非常好的例子:

你有一个窗口接口,有两个子类:XWindow(基于X Window Manager)和PMWindow(基于IBM的Presentation Manager (PM)窗口管理器……我从未听说过)。

比如:

interface Window {}
class XWindow : Window {}
class PMWindow : Window {}

我们传统的继承方法存在问题,如果你针对Window进行特殊化处理,但不是针对它的平台依赖性(即,你有一些责任与你创建继承树的支持方面正交),那么你需要使用桥接模式,否则你的类层次结构会呈几何增长。我认为,将桥接视为继承和组合的组合是一个好方法。
这段话有些啰嗦。回到TGF的例子:如果你想要一个IconWindow和一个TransientWindow(类似于玻璃窗),"图标 vs 短暂" 和 "PM vs X" 的概念是两个正交的想法,但它们都试图进入同一个继承树。如果不使用桥接模式,你需要创建两个新接口,它们从第一个接口继承,并在它们下面创建一堆类:
interface Window {}
class XWindow : Window {}
class PMWindow : Window {}
interface IconWindow : Window {}
class XIconWindow : XWindow, IconWindow {}
class PMIconWindow : PMWindow, IconWindow {}
interface TransientWindow : Window {}
class XTransientWIndow : XWindow, TransientWindow {}
class PMTransientWindow : PMWindow, TransientWindow {}

使用桥接模式,您可以将这两个职责分别安排到两个继承树上:
interface Window {}
class IconWindow : Window {} //this class...
class TransientWindow : Window {} //and this one will keep a private reference to aWindowImp
interface WindowImp: Window {}
class XWindowImp : WindowImp {}
class PMWindowImp : WindowImp {}

更加整洁,责任分离得更好,并且更容易编写和消费!

认为这个设计问题以及桥接对象树本身的怪异性实际上是Scala中Mix-ins设计的一些驱动因素。使用C ++的多重继承,您将静态耦合任何实现到其窗口系统。换句话说,您将拥有与非桥接模式相同数量的类型,但它们可能是空类,当然您可以通过抽象引用它们,这使得消费起来相当容易。


这是一个很好的例子,但是你能描述一下“桥接模式”和“策略模式”的区别吗?它们看起来很相似! - Seyed Morteza Mousavi
谢谢,我认为你的例子很好地解释了“桥接模式”。 - Seyed Morteza Mousavi
1
我认为一个每个人都能理解的例子会更加合适(很多人甚至不熟悉这些日期技术)。 - FBryant87

3
桥接模式的优点在于可以将抽象和实现解耦,实现也可以在运行时动态地改变,从而提高了抽象和实现的可扩展性。
通过在抽象生成中指定参数,也可以为客户端的实现选择实现方式,而完全隐藏其实现。这样就可以避免类数量的大幅增加。 Wiki UML

你能举个例子吗? - Seyed Morteza Mousavi
请查看此链接:http://www.dofactory.com/Patterns/PatternBridge.aspx#_self1。 - Kurubaran
想象一下,你有一个类可以访问抽象类中的一个方法,而这个类想要实现该方法。通过桥接模式,你现在可以在运行期间更改实现,因此不再受限于抽象类中的方法。 - JavaDM
@Coder 我看了那些链接,但它们对我没有帮助。 - Seyed Morteza Mousavi
谢谢@WEBALDO.at。您能否在示例中展示如何在运行时动态更改ListListImpl - Seyed Morteza Mousavi
这里可以看到一些很好的例子: https://dev59.com/vXI-5IYBdhLWcg3wy7sd?rq=1 - JavaDM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接