我知道,这个问题已经被问了很多次,但是我做了一些研究,仍然不明白,也许你可以帮帮我:
就像之前所说的那样,UML几乎是相同的。实现和思想也或多或少相同:不使用子类型,而是定义一个接口,它封装了一些逻辑并将其传递给一个抽象类。
因此,即使是微软博客的人们也https://blogs.msdn.microsoft.com/gyanjadal/2015/01/05/difference-between-strategy-and-bridge-patterns/说:
简单的答案是“它们相似但不同”。实现虽然相似,但意图不同。打个比方,城市公交车和校车都是相似的车辆,但用途不同。一个用于在城市各地之间运输人员,作为通勤服务。另一个用于将孩子送到学校。
“如果它听起来像鸭子,看起来像鸭子,但它的意图是天鹅,那么它可能是它们中的任何一个”,这是我在这里读到的。
由于我仍然没有理解,所以我深入挖掘:
这个线程没有添加任何新内容,除了:
它们在表面上看起来对我来说是一样的。我看到的主要区别在于桥接模式中抽象部分是对象的一部分,但在策略模式中抽象是由对象执行。
但是,如果我们阅读策略的定义:
定义一组算法,将每个算法封装起来,并使它们可以互换。策略允许算法独立于使用它的客户端而变化。
并没有定义策略如何应用。它也可以很容易地成为抽象的接口,就像常见的Strategy-Implementation,例如LINQ-Orderby等。
关于这个主题的另一个有趣观点在这里:
http://game-engineering.blogspot.ch/2008/07/bridge-pattern-vs-strategy-pattern.html
这篇文章的主要内容是:当您想要改变行为时,可以通过引入类继承关系而不是编写不同对象来使用“策略”模式。当您期望界面和实现都会变化时,可以使用“桥接”模式。在这两种情况下,都提供了对于可变实现的灵活性;在桥接模式中,您还期望界面发生变化。
这可能是两者之间的主要区别。由于实现者和抽象层松散耦合,因此我可以更改实现者的接口,而抽象层则不必关心这个变化?这听起来很合理,但难道抽象层也不需要更改吗,因为它们有某种联系吗?那样做不会破坏其他原则,如信息隐藏和DRY原则吗?
我还查看了许多例子,出于空间考虑,我不在此处添加,但我无法找到任何一个例子,其中一个模式无法更改以适应另一个模式。无论是通过接口属性还是仅通过参数。
我有遗漏吗?是否有人有一个真实的例子,“我想使用策略模式,但桥接模式更加合适”,或者反过来的例子?
编辑:为什么我要为这个主题再次正式开一个帖子呢?首先,提到的帖子中被接受的答案如下:
“据我所知,当您从外部源(例如,配置可以指定加载某些插件程序集)抽象出可能提供的行为时,您正在使用策略模式,当您使用相同的构造使代码变得更加整洁时,您正在使用桥接模式。实际的代码看起来非常相似-您只是为稍微不同的原因应用了这些模式。”
我已经在以前的解释中提供了从外部源中抽象行为的定义,这恰好是策略和桥接模式的定义。
此外,
“当您使用相同的构造使代码变得更加整洁时,您正在使用桥接模式。”
此外,策略模式使代码变得更加整洁,因为它将一个完整的构建块抽象掉,从而大大缩短了代码。
我认为任何阅读整个主题的人都会发现,这个主题不仅仅是这两个句子。