我被一位同事质疑我在ASP.net客户端应用程序中实现WCF Windows服务的设计模式,我真的不知道它是 Bridge 还是 Adapter !
以下是实施:
我一直认为它是适配器模式的实现,但实际上我不知道为什么不是 Bridge !
我已经阅读了SO,GoF和维基百科中的所有帖子,但它确实毫无意义!
根据我的理解,两种模式指向现有类型,将抽象与其实现分离我错过了一点吗?
这是来自GoF:
这些模式之间的关键区别在于它们的意图。 Adapter专注于解决两个现有的不兼容问题 接口。它没有关注如何实现这些接口, 它也不会考虑它们如何独立发展。这是一种方式 使两个独立设计的课程在一起工作 重新实现其中一个。另一方面,桥梁桥梁 抽象及其(可能很多)实现。它 为客户提供稳定的界面,即使它可以让您改变 实现它的类。它还适应新的实现 系统在发展。
我不完全理解上述陈述,
更新
再次来自GoF:
请记住,适配器使两个现有接口协同工作 而不是定义一个全新的。
这是否意味着更改现有界面以便它可以与其他界面一起使用是适配器的实现?
UPDATE2:
刚刚发现这篇令人难以置信的文章:Illustrated GOF Design Patterns in C#
这是真正的Bridge Patter结构:
我错过了Bridge模式允许您组合不同的抽象和实现以及扩展它们的事实
答案 0 :(得分:6)
我认为你这里没有纯粹的GoF模式。这是Decorator和Adapter之间的东西。您正在更改服务客户端的界面(根据您的需要进行调整)。但是你也在为客户增加新的职责(记录和错误处理) - 这就是装饰部分。如果你保留原始服务界面,它将是纯粹的装饰。
更新:继承的任何使用并不意味着我们正在使用一些GoF模式。你目前的架构遗漏了几件事:Bridge:
答案 1 :(得分:5)
我解释了桥模式是为了将两个类层次结构组合起来以达到不同的目的。例如,考虑您正在编写一个具有不同类型控件的窗口框架,并支持不同的窗口系统。你有一个用于控件的类树,另一个用于抽象出窗口系统之间的差异。现在,如果要添加对另一个窗口系统的支持,只需将其添加到层次结构的那一侧,如果要添加新控件,则将它们添加到它们的一侧。 “桥”存在于两个层次结构的顶级类之间,其中您的控件类可以访问由实现对各种窗口系统的支持的类层次结构的基类定义的抽象函数。
使用适配器模式,您不希望将两个具有不同意图的类层次结合起来,而是使一个类适用于您自己的接口。我想如果您在上面的示例中仅支持单个窗口系统,并且不在其间放置一个抽象类来维护可扩展性,那么这将是适配器而不是桥接器。
答案 2 :(得分:4)
这在前面已经讨论过 - Difference between Bridge pattern and Adapter pattern - 你想从GoF得到的真实报价是“适配器让它们在设计之后起作用; Bridge使它们在它们出现之前就可以工作了。[GoF,p219]
你的上一个问题得到了肯定 - 一个适配器用于使系统中两个令人不愉快的元素很好地结合在一起,而不会改变它们的基本功能,除了可能将它们的功能联合分组 -
桥接模式通常用于处理初始设计中的问题,其中呈现给消费者的心理模型可能与实现消费者模型的实现的模型大不相同。考虑一个在各种各样的处理器中看起来相同的高性能数学库 - 你只想增加矩阵,但在幕后有各种各样的混乱涉及混合,并行数据流,避免管道停滞的奇怪行为,以及所有完成高性能超级计算机核心的3 +实现不同 - 那就是英特尔:-(