【发布时间】:2016-12-13 08:49:50
【问题描述】:
我知道,这个问题被问了很多次,但我做了一些研究,仍然没有得到它,也许你可以帮助我: 如多次所述,UML 几乎相同。此外,实现和想法或多或少是相同的:您定义了一个接口,而不是子类型,它封装了一些逻辑并将其传递给抽象。 所以,即使是微软博客的人
简单的答案是“它们相似但不同”。这 实现相似,但意图不同。给予 打个比方,城市公交车和校车都是类似的交通工具,但是 它们用于不同的目的。一种是用来运送人的 作为通勤服务在城市的各个部分之间。另一个是 用于接送孩子上学。
“如果它听起来像一只鸭子,看起来像一只鸭子,但它打算成为一只天鹅,它可以是它们中的任何一个”,这是我在这里读到的。
由于我还是没搞懂,所以我深入挖掘:
这个线程也没有添加任何新内容,除了:
在我看来,它们在表面上看起来也一样。主要的 我看到的不同之处在于,在桥接模式中, 抽象是对象的一部分,但在策略模式中 抽象由对象执行。
但是,如果我们阅读策略的定义:
定义一系列算法,封装每一个,并制作它们 可互换。策略让算法独立于 使用它的客户。
没有任何定义,如何应用策略。它也可以很容易地成为 Abstract 上的接口,与 LINQ-Orderby 等常见的 Strategy-Implementation 完全相同。
关于这个话题的另一个兴趣点在这里:
http://game-engineering.blogspot.ch/2008/07/bridge-pattern-vs-strategy-pattern.html
本次讲座的主要部分:
当你想改变行为时,你会说“策略”,但你没有这样做 通过编写不同的对象但通过引入类层次结构。你 当你期望你会改变界面和 实施。在这两种情况下,您都为 改变实施;在一座桥中,你也期待 界面变化。
这可能是主要区别吗?既然Implementor和Abstraction是松耦合的,我可以改变Implementor的Interface,Abstraction就不用管了吗?这听起来很合理,但是由于它们之间存在某种联系,所以抽象不会也发生变化吗?这不会破坏信息隐藏和 DRY 等所有其他原则吗?
我还查看了许多示例,为了方便起见,我没有在此处添加,并且我找不到其中任何一个模式的示例,我无法更改以适应另一个模式。无论是通过接口属性还是仅通过参数。
我在这里错过了什么吗?可能有人有“我想使用战略,但桥确实更适合”的真实例子,或者反之亦然,例子?
编辑:为什么我要为这个主题(再次)证明自己的主题?首先,上述线程的接受答案如下
据我了解,您在使用策略模式时 抽象可以从外部来源提供的行为 (例如 config 可以指定加载一些插件程序集),你是 当您使用相同的结构来制作您的 代码更整洁一些。实际代码看起来非常相似 - 你是 只是出于稍微不同的原因应用这些模式。
我在前面的解释中已经提供了,从外部源抽象行为正是策略和桥接模式的定义。
还有
当您使用相同的结构时,您正在使用桥接模式 让你的代码更整洁。
此外,策略模式使代码更整洁,因为它抽象了整个构建块,从而使代码更加精简。
我认为任何阅读了整个主题的人都会看到,关于这个主题的内容不仅仅是这两句话。
【问题讨论】:
-
说实话,我从来没有说过“我想使用 SomePattern”。我解决了问题,然后使用模式向其他开发人员描述了我所做的事情。
-
我查看了这个帖子,但普遍的共识是“桥梁是结构性的,战略是行为性的”,这不足以让我解决这个谜题。因为没有人能给出正确的答案而结束话题是没有意义的,因为人们经常从一个问题中学习,而不是从给出的答案中学习,而给出的答案通常只反映一种观点。
-
Head First Design Patterns 中的
RemoteControl示例很好地解释了 Bridge。在该示例中,它更接近于命令模式而不是策略模式。
标签: c# oop design-patterns strategy-pattern bridge