【问题标题】:What is the exact difference between 'Adapter' and 'Mediator" patterns?“适配器”和“中介”模式之间的确切区别是什么?
【发布时间】:2016-10-12 22:57:42
【问题描述】:

我知道 Adapter 是一种结构模式,而 Mediator 是一种行为模式。但据我了解,他们都在做的是连接两个(或更多)其他可能不兼容(不太可维护)的类以进行直接通信。

有人可以对这两者进行仔细比较并指出确切的区别吗?

这些是TutorialsPoint 中AdapterMediator 解释的链接。

这些都是来源解释。 Adapter, Mediator.

【问题讨论】:

  • 如果你问我,这些假定模式的两个示例并不是非常有说服力或理想的方式来做他们声称的事情。我会寻找更权威的模式来源,因为记录模式的一个关键方面是展示该模式相对于其他替代模式的优点,而这些反模式都没有做到这一点。
  • @barny 你能提供一些吗?
  • 哈哈,我不是模式专家。有一些很好的模式书。
  • @barny 无论如何我不能链接任何书,对吧?另一方面,有许多问题引用了教程点的解释。但是如果你建议我的问题应该仅仅因为这两个链接而下降,这不公平吗?如果我没有引用怎么办?你说有更好的文章,当我要求你介绍它们时,你说你不知道。另一方面,如果我发现那个孩子的解释很好,我就不会问这个问题。无论如何,我添加了来源解释链接。请考虑。 :)
  • 我最喜欢的答案是:cs.stackexchange.com/a/2290。仅供参考,我认为“将模式 X 与模式 Y 比较”的每一个组合都已在 SO 或其他 SE 社区论坛上被多次询问和回答。

标签: oop design-patterns adapter object-oriented-analysis mediator


【解决方案1】:

他们没有太多共同点,IMO。

中介用于避免将多个组件耦合在一起。不是每个组件直接相互“交谈”(因此必须相互了解并知道如何相互通信),而是每个组件都与一个对象交谈:中介。这个名字是故意选择的:当你和你的邻居吵架并且无法与他沟通时,你会去看调解员,而不是相互交谈,而是与调解员交谈,调解员试图解决问题。

适配器用于将具有接口的对象“转换”为具有其他接口的对象。就像,例如,将欧洲电源插座转换为美国电源插座的电源适配器,这样您就可以在欧洲使用您的美国剃须刀。 简单示例:您需要将 Runnable 存储到 Callables 列表中。 Runnable 有一个方法 run()。 Callable 有一个方法 call()。您因此创建了一个适配器:

public class RunnableAdapter implements Callable {
    private Runnable runnable;

    public RunnableAdapter(Runnable runnable) {
        this.runnable = runnable;
    }

    public void call() {
        runnable.run();
    }
}

【讨论】:

  • @JB Nizet,感谢您的解释。无论如何,在您的解释中,是否存在隐含意味着调解器是支持超过 2 个类的适配器。
  • 不,我不会这么说的。
  • 好吧。在这两种情况下,调解器/适配器的用户对象都无法访问调解/调整的目标,并且不知道 impl。与它的通信细节,以及适配器/调解器 - 这足以说明它们有一个坚实的共同基础。我敢说你指出的差异甚至不是逻辑而是哲学。
【解决方案2】:

Adapter Pattern 在我们已经有两个代码库时非常有用987654329@ 代码正在生成。 这里生产代码已经存在,我们不希望修改现有代码[代码关闭以进行修改,打开以进行扩展]Adapter类可以将Producer生产的产品转化为Consumer代码所期望的格式。 Format可以是根据Producer代码和消费者代码期望的返回类型不同的API。适配器类使用生产者代码的 API 并根据消费者的期望对其进行转换。

现在,当我们在设计架构或重构时,中介者模式很有用。它有助于对象的轻松和松散耦合的交互。定义一个对象[Mediator],封装一组对象如何交互。 Mediator 通过阻止对象显式地相互引用来促进松散耦合,并且它允许您独立地改变它们的交互。

【讨论】:

    【解决方案3】:

    JB Nizet 已经写了一个很好的答案。我只是想用更简单的词来解释它们的区别:

    • Mediator 应在您不知道如何与其他对象通信或您不允许

    • Adapter应该在你知道确切如何与对象通信时使用,但这些对象可能不支持某些通信方法或不同

    【讨论】:

      【解决方案4】:

      有人可以对这两者进行仔细比较并指出确切的区别吗?

      来源制作链接中的 intentchecklist(已在您的问题中引用)提供了很好的洞察力。

      适配器将一个类的接口转换成客户期望的另一个接口

      Mediator 通过防止对象显式地相互引用来促进松散耦合,并且它允许您独立地改变它们的交互。

      是否存在隐含意味着调解器是支持超过 2 个类的适配器。由于这个原因,Mediator 不能充当 Adapter

      1. Mediator 不会将不兼容的接口转换为兼容的接口,这与 Adapter 不同的是客户端所期望的。

      2. Mediator 与同一界面的Collegues 交互。

      3. Mediator 抽象/集中Colleague 对象之间的任意通信

      带有代码示例的相关帖子:

      Mediator Vs Observer Object-Oriented Design Patterns

      Difference between Bridge pattern and Adapter pattern

      【讨论】:

        猜你喜欢
        • 2016-10-08
        • 2021-07-21
        • 2017-12-03
        • 2018-10-02
        • 2016-01-19
        • 2013-03-25
        • 2016-01-19
        • 1970-01-01
        相关资源
        最近更新 更多