20

一位同事向我询问了我在 ASP.net 客户端应用程序中实现 WCF Windows 服务的设计模式,我真的不知道它是Bridge还是Adapter

这是实现:

  • 我已获得服务合同
  • 定义了一个类似于我的 WCF 数据合约的新接口
  • 我创建了一个 WCF 客户端并将其包装在新界面中
  • 将新的接口操作映射到原来的 WCF 客户端(我在这里做了一些日志记录/错误处理)

我一直认为它是适配器模式的实现,但我真的不知道为什么不是Bridge

我已经阅读了 SO、GoF 和维基百科中的所有帖子,但这真的毫无意义!

据我了解,这两种模式都指向一个现有类型,都将抽象与其实现分离,我错过了一点吗?

这是来自GoF的:

这些模式之间的主要区别在于它们的意图。适配器专注于解决两个现有接口之间的不兼容性。它不关注这些接口是如何实现的,也不考虑它们如何独立发展。这是一种让两个独立设计的类一起工作而无需重新实现一个或另一个的方法。另一方面,桥接了一个抽象及其(可能有很多)实现。它为客户端提供了一个稳定的接口,即使它允许您改变实现它的类。随着系统的发展,它还适应新的实现。

我不完全理解上面的说法,

  1. 这是否意味着如果我在设计时改变适配者或更改原始接口的实现,那么它就是桥接模式
  2. 差异听起来微不足道,在实现/抽象方面还有其他差异吗?
  3. 谁能知道开发使用了什么实现 ?
  4. 谁能给我一个很好的桥接模式示例以及如何在软件生命周期中更改它?

更新:

再次来自 GoF:

请记住,适配器使两个现有接口协同工作,而不是定义一个全新的接口。

这是否意味着更改现有接口以使其可以与另一个接口一起使用是Adapter的实现?

更新2:

刚刚发现这篇令人难以置信的文章:Illustrated GOF Design Patterns in C#

这是真正的 Bridge Pattern 结构:

我错过了桥模式允许您组合不同的抽象和实现并独立扩展它们 的事实在此处输入图像描述

4

3 回答 3

6

我认为您这里没有纯 GoF 模式。这是装饰器和适配器之间的东西。您正在更改服务客户端的界面(使其适应您的需要)。但是您也在向客户端添加新职责(日志记录和错误处理) - 这是一个装饰部分。如果您要保留原始服务接口,那将是纯装饰器。

更新:任何继承的使用并不意味着我们正在使用一些 GoF 模式。您当前的架构缺少桥接功能:

  • 实现的层次结构。您的服务接口应该定义一些低级操作。你应该有几个服务实现。
  • 抽象应该定义高级接口。通常这些接口看起来与实现接口不相似(您的客户端接口类似于服务接口,它存在于同一抽象级别上)。
  • 抽象实现应该使用服务接口来实现高级操作(即它们不向服务添加一些职责,它们实现不同的东西,高级的东西)。
于 2012-05-17T19:37:22.563 回答
5

我被解释为将两个具有不同目的的类层次结构结合起来的桥模式。例如,考虑您正在编写一个具有不同类型控件并支持不同窗口系统的窗口框架。您将拥有一个用于控件的类树,而另一个用于抽象出窗口系统之间的差异。现在,如果您想添加对另一个窗口系统的支持,只需将其添加到层次结构的那一侧,如果您想添加新控件,请将它们添加到它们的一侧。“桥梁”存在于两个层次结构的顶级类之间,您的控制类可以访问由实现对各种窗口系统的支持的类层次结构的基类定义的抽象函数。

使用适配器模式,您不想组合具有不同意图的两个类层次结构,而是调整一个类以使用您自己的接口。我想如果您在上面的示例中只支持单个窗口系统并且不将抽象类放在中间以保持可扩展性,那将是适配器而不是桥接器。

于 2012-05-17T19:33:44.980 回答
5

此处之前已对此进行过讨论-桥接模式和适配器模式之间的区别-您希望从 GoF 获得的真正引用是“适配器使事情在设计后工作;桥使它们在设计之前工作。[GoF,p219]

您的最后一个问题是肯定的-适配器用于使系统的两个原本令人不快的元素很好地协同工作,而不会改变它们的基本功能,而不会改变它们的功能联合-

桥接模式通常用于处理初始设计中呈现给消费者的心理模型可能与实现消费者模型的模型大不相同的问题。考虑一个高性能数学库,它在各种处理器上看起来都一样——你只是想将矩阵相乘,但在幕后有各种各样的麻烦,包括混合、并行数据流、避免管道停顿的奇怪行为,等等。在 3+ 高性能超大规模内核的实现上有所不同——这只是英特尔 :-(

于 2012-05-17T20:28:13.407 回答