桥接模式 vs 适配器模式设计模式

22

我的一个同事问我关于WCF windows服务在ASP.net客户端应用程序中实现的设计模式,我真的无法确定它是桥接(Bridge)还是适配器(Adapter)

这是我的实现:

  • 我获取了服务契约
  • 定义了一个与我的WCF数据契约类似的新接口
  • 我创建了一个WCF客户端,并将其包装在新接口中
  • 将新接口操作映射到原始的WCF客户端(我在这里进行一些日志记录/错误处理)

我一直认为这是适配器模式的实现,但我真的无法确定为什么不是桥接模式!

我已经阅读了SO、GoF和维基百科上的所有帖子,但它真的没有任何意义!

从我的理解来看,两种模式都指向现有类型,都将抽象与其实现分离,我错过什么了吗?

以下是来自GoF的内容:

这些模式之间的关键区别在于它们的意图。适配器侧重于解决两个现有接口之间的不兼容性。它不关注这些接口是如何实现的,也不考虑它们可能独立地发展。它是一种在不重新实现其中一个类的情况下使两个独立设计的类协同工作的方法。桥接模式则桥接了一个抽象和它的(潜在的众多)实现。它为客户提供了一个稳定的接口,同时允许您变化实现它的类。随着系统的发展,它还可以容纳新的实现。

我不完全理解上述陈述,

  1. 这是否意味着如果我在设计时更改被适配者或原始接口的实现,则它是桥接模式
  2. 这些差异听起来微不足道,是否还有其他的实现/抽象方面的差异?
  3. 开发后如何确定使用了哪种实现?
  • 有人能给我举一个好的桥接模式的例子并说明它在软件生命周期中如何改变吗?
  • 更新:

    同样来自GoF:

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

    这是否意味着更改现有接口以使其与另一个接口协同工作是 Adapter 的实现方式?

    更新2:

    刚刚发现了这篇令人难以置信的文章:C#中的GOF设计模式图解

    这是真正的桥接模式结构:

    我错过的是,桥接模式让你独立地组合不同的抽象和实现,并且可以将它们 扩展 enter image description here

    3个回答

    6
    我认为这里没有纯GoF模式。它介于装饰器和适配器之间。您正在更改服务客户端的接口(将其适应您的需求)。但是,您还向客户端添加了新的责任(记录和错误处理)-这是装饰器的一部分。如果您保持原始服务接口,它将是纯装饰器。
    更新:任何继承的使用并不意味着我们在使用某个GoF模式。您当前的架构缺少以下几点才能成为桥接模式:
    • 实现层次结构。您的服务接口应定义一些低级操作。您应该有几种服务实现。
    • 抽象应定义高级接口。通常,这些接口看起来与实现接口不相似(您的客户端接口类似于服务接口,它存在于相同的抽象级别上)。
    • 抽象实现应使用服务接口来实现高级操作(即它们不会向服务添加某些责任,它们实现不同的高级事物)。

    是的,你说得对,关于装饰器部分没错。然而根据定义,这似乎是桥接模式,因为WCF服务契约在软件生命周期中是不断演变的! - Kamyar Nazeri
    桥接器用于连接两个类层次结构。我这里没有看到任何层次结构。 - Sergey Berezovskiy

    5
    我将桥接模式解释为将两个具有不同目的的类层次结构组合在一起的一种意图。例如,考虑编写一个带有不同类型控件和支持不同窗口系统的窗口框架。您需要为控件和抽象窗口系统之间的差异建立一个类树。现在,如果您想要添加对另一个窗口系统的支持,只需将其添加到该层次结构的侧面即可;如果您想要添加新的控件,则将它们添加到其侧面。 "桥"存在于两个层次结构的顶部类之间,在这里,您的控件类可以访问由实现支持各种窗口系统的类层次结构的基类定义的抽象函数。
    适配器模式是将一个类适应为与您自己的接口一起使用,而不是将两个具有不同目的的类层次结构组合在一起。我想,如果您在上述示例中仅支持单个窗口系统,并且没有在其中放置一个抽象类以保持可扩展性,则它将是适配器而不是桥接。

    5

    此前在这里已经讨论过-桥接模式和适配器模式的区别-你想要从GoF引用的真正语句是“适配器使事物在设计后起作用;桥梁使它们在设计之前起作用。[GoF,p219]”

    你上一个问题的答案是肯定的-适配器用于使系统中两个不协调的元素友好地一起工作,而不改变它们的基本功能,除了可能对它们功能的联合进行子集处理-

    桥接模式通常用于处理最初设计中的问题,在其中呈现给消费者的心理模型可能与实现消费者模型的模型大相径庭。考虑一个高性能数学库,它在各种处理器上看起来都是一样的-您只想乘以矩阵,但背后有各种各样的垃圾涉及到数据流复用、并行处理、避免管道停顿的奇怪行为,并且在高性能超标量核心的3+实现中更加不同-那只是Intel :-(


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接