Mat*_*ler 10 c# oop design-patterns bridge strategy-pattern
我知道,这个问题被多次询问,但我做了一些研究,但仍然没有得到它,可能你可以帮助我:正如很多次说的那样,UML几乎是一样的.此外,实现和想法或多或少相同:您可以定义一个Interface,而不是子类型,它封装了一些逻辑,让它传递给一个抽象.所以,即使是微软博客的人
简单的答案是"它们相似但不同".实现类似但意图不同.举一个类比,城市公交车和校车都是类似的车辆,但它们用于不同的目的.一种用于在城市的各个部分之间运送人员作为通勤服务.另一个用于将孩子送到学校.
"如果它看起来像一只鸭子,看起来像一只鸭子,但它打算成为一只天鹅,它可以是其中之一",这就是我在这里读到的.
因为我还没有得到它,所以我深入挖掘:
此线程也不添加任何新内容,除了:
它们在表面上看起来也一样.我看到的主要区别在于,在Bridge模式中,抽象是对象的PART,但在Strategy模式中,抽象是由对象执行的.
但是,如果我们阅读战略的定义:
定义一系列算法,封装每个算法,并使它们可互换.策略允许算法独立于使用它的客户端.
没有任何定义,如何应用该战略.它也可以很容易地成为摘要上的接口,与LINQ-Orderby等常见的策略实现完全相同.
关于这个主题的另一个兴趣是:
http://game-engineering.blogspot.ch/2008/07/bridge-pattern-vs-strategy-pattern.html
这个话题的主要部分:
当你想要改变行为时,你会说"策略",而你不是通过编写不同的对象而是通过引入类层次来实现.当您希望改变界面和实现时,您会说"Bridge".在这两种情况下,您都可以为不断变化的实施提供灵活性; 在Bridge中,您还希望界面能够改变.
这可能是主要区别吗?由于执行器和抽象是如此松散耦合,我可以改变执行器的接口,抽象不必关心?这听起来很合理,但是由于它们是有联系的,所以也不会有抽象改变吗?这不会破坏信息隐藏和DRY等所有其他原则吗?
我还看了很多例子,我不会为了这个地方而添加这些例子,我找不到这些模式的例子,我无法改变以适应另一个.无论是通过Interface-Property还是参数.
我在这里错过了吗?可能任何人都有一个真实生活的例子"我想使用策略,但Bridge确实更合适",反之亦然,例如?
编辑:为什么我为这个主题辩护(再次)?首先,所提到的线程的接受答案如下
据我了解,当你抽象出可以从外部源提供的行为时(例如,config可以指定加载一些插件程序集),你正在使用策略模式,并且当你使用时你正在使用桥接模式相同的结构使你的代码更整洁.实际的代码看起来非常相似 - 你只是因为略有不同的原因而应用这些模式.
我在之前的解释中已经提到,外部源的抽象行为正是Strategy-和Bridge-Pattern的定义.
也
当你使用相同的结构使你的代码更整洁时,你正在使用桥接模式.
此外,策略模式使代码更整洁,因为它将整个构建块抽象出来,从而使代码收紧了很多.
我想任何阅读整个主题的人都会看到,这个主题的内容比这2个句子更多.
我检查了原始设计模式书籍,了解作者如何定义桥接模式。他们的现实例子展示了抽象和实现层次结构都可以独立更改的情况(即可以为抽象引入新的子类;可以为实现引入新的子类)。他们的示例涉及可用于不同窗口系统的窗口库。
在最初的示例中,作者使用了与 IBM 不同的窗口系统,但我相信当前的一个很好的类比是不同的 Linux 窗口管理器(GNOME、KDE 等)。
因此,想象一个 Window 抽象以及 GNOME 和 KDE 的两个实现。现在假设您想要添加新的 Window 子类,TransparentWindow。TransparentWindow 扩展了 Window,GNOMEWindow 和 KDEWindow 也是如此。但您还必须提供透明窗口的实现:GNOMETransparentWindow 和 KDETransparentWindow。层次结构开始显得混乱。
想象一种新类型的窗口,或者新的窗口管理器 - XFCE。为了避免复杂的层次结构,他们引入了 Bridge 模式,并使两个层次结构分开(即透明窗口扩展窗口;GNOMEWindow 和 KDEWindow 扩展 WindowImpl)。
对我来说,棘手的部分似乎是定义一个用于实现的接口,因为抽象层次结构需要仅使用该接口来定义其操作。
我喜欢的 Bridge 模式的学习示例在这里,我喜欢它是因为它不使用人工类 ConcreteImplementor1 和 ConcreteImplementor2。当谈到现实生活中的例子时,我相信我在 Selenium WebDriver 实现中看到了这种模式,但我现在还不能 100% 确定。