“适配器模式”和“中介者模式”的确切区别是什么?

19

我知道适配器模式(Adapter)是一种结构型模式,而中介者模式(Mediator)是一种行为型模式。但据我理解,它们都是将两个(或更多)可能不兼容(难以维护)进行直接通信的类相连接。

有没有人能够对这两种模式进行详细比较,并指出它们的确切区别?

以下是TutorialsPoint提供的适配器模式和中介者模式的解释链接和解释链接。

以下是Sourcemaking提供的适配器模式和中介者模式的解释链接和解释链接。


如果你问我,这些所谓模式的两个例子并不是非常令人信服或理想的做法。我会寻找更权威的模式来源,因为记录模式的关键之一是展示该模式相对于其他替代方案的优点,而这两个反模式都没有做到这一点。 - DisappointedByUnaccountableMod
@barny,你能提供一些吗? - Supun Wijerathne
哈哈,我不是模式方面的专家。有一些好的模式书籍。 - DisappointedByUnaccountableMod
@barny 无论如何,我都不能链接任何书籍,对吧?另一方面,有很多问题引用了tutorialspoint的解释。但是如果你认为我的问题应该因为这两个链接而被拒绝,那就不公平了,对吧?如果我没有引用任何链接呢?而且你说有更好的文章,当我要求你展示它们时,你又说你不知道。另一方面,如果我找到了一个很好的解释,我也不会问这个问题了。无论如何,我已经添加了sourcemaking的解释链接。请考虑一下。 :) - Supun Wijerathne
我最喜欢的答案是:http://cs.stackexchange.com/a/2290。顺便说一下,我认为每种“将模式X与模式Y进行比较”的组合都已经在SO或其他SE社区论坛上被问过和回答过很多次了。 - jaco0646
适配器 ~= 装饰器,但不会添加职责 | 外观 ~= 适配器,但是可以为多个接口执行此操作 | 外观 ~= 中介者,除了其意图。中介者在技术上可以是一个带有回调的单个函数--99%的时间中介者将处理业务逻辑,而不是像utils模块那样的工作,这可能更适合外观。它们都非常相似,但没有考虑规模、细微差别或意图 - Cody
4个回答

22

在我看来,他们之间没有太多共同点。

中介者模式用于避免将多个组件耦合在一起。每个组件不直接“交流”(从而需要相互了解和知道如何彼此交流),而是与单个对象——中介者交流。这个名称是有意选择的:当你与邻居发生冲突并且无法沟通时,你找一个调解员,而不是互相交谈,双方都与调解员交谈,试图解决问题。

适配器用于将具有一种接口的对象“转换”为具有其他接口的对象。就像一个电源适配器将欧洲插座转换成美国插座一样,这样您就可以在欧洲使用您的美国剃须刀。 简单的例子:您需要将Runnable存储到Callable列表中。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个类的适配器吗? - Supun Wijerathne
不,我不会这么说。 - JB Nizet
在这两种情况下,中介者/适配器的用户对象都无法访问被调解/适配的目标,并且不知道与其通信的实现细节,而适配器/中介者则知道 - 这足以说明它们有一个坚实的共同基础。我敢说,你指出的差异甚至不是逻辑上的,而是哲学上的。 - Radagast the Brown

15

JB Nizet已经给出了一个很好的答案。我只想用更简单的话解释一下它们的区别:

  • 中介者模式应该在你不知道如何与其他对象通信或者不被允许与其通信时使用。

  • 适配器模式应该在你知道如何与对象进行通信,但这些对象可能不支持某些通信方法或者存在差异时使用。


5

适配器模式 在我们已经有两个代码库,一个是消费者代码,另一个是生产者代码,但是消费者希望产品的格式与生产者生产的不同时非常有用。这里生产代码已经存在并且我们不希望修改现有的代码[关闭修改,开放扩展]适配器类可以将生产者生成的产品转换为消费者代码所期望的格式。 格式可能是API,根据生产者代码和消费者代码的期望返回类型不同。适配器类使用生产者代码的API并按照消费者的期望进行转换。enter image description here

现在,中介者模式 在设计架构或重构过程中很有用。它有助于对象之间的轻松和松散耦合交互。定义一个对象[中介者],封装了一组对象的交互方式。 中介者通过保持对象不会直接相互引用来促进松散耦合,同时可以使您独立地改变它们的交互。enter image description here


1
有人能详细比较这两者并指出确切的区别吗?
在您的问题中引用的sourcemaking链接中的意图检查清单提供了很好的见解。 适配器将一个类的接口转换为客户端期望的另一个接口。 中介者通过不让对象直接相互引用来促进松散耦合,并使您能够独立地改变它们的交互。
难道没有一些含义暗示中介者是支持超过2个类的适配器吗?由于这个原因,中介者不能充当适配器
1. 中介者不像适配器那样将不兼容的接口转换为客户端期望的兼容接口。 2. 中介者与具有相同接口的同事进行交互。 3. 中介者抽象/集中了同事对象之间的任意通信。
相关帖子及代码示例:

中介者模式与观察者模式的面向对象设计模式

桥接模式和适配器模式之间的区别


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