Answers:
在外观模式的维基页面有关于这一个简短的说明。
“当包装器必须遵循特定的接口并且必须支持多态行为时,将使用适配器。另一方面,当人们希望使用更简单或更简单的接口时,将使用外观。”
我听到一个类比,您应该想到已设置为可与所有不同的立体声系统配合使用的通用遥控器-按下“开”,它会打开电缆盒,接收机和电视。也许这是一个真正的高档家庭影院,它可以调暗灯光并绘制阴影。这是一个Facade-一个按钮/功能,需要执行一系列更复杂的步骤。
适配器模式仅链接两个不兼容的接口。
编辑:适配器模式的快速类比(基于注释)可能类似于DVI-VGA适配器。现代视频卡通常是DVI,但您有一个旧的VGA显示器。通过将适配器插入视频卡预期的DVI输入并具有自己的VGA输入的适配器,您将能够使旧显示器与新视频卡一起使用。
InputStreamReader
适应InputStream
于Reader
并且OutputStreamWriter
适应OutputStream
于Writer
两者都是不同的抽象类型。
正面:
关键要点:(摘自 Pankaj Kumar的journaldev文章)
外立面类图:
适配器:
适配器的类图:
您可以在此SE帖子中找到有关适配器的更多详细信息:
主要区别:
也可以查看有关源制作的文章,以更好地理解。
someMethod(int year, int month)
被委派给someMethod(DateTime start, DateTime end)
或说被someMethod()
委派给了someMethod(T param)
目的
门面是简单
适配器具有互操作性。
外墙通常与适配器形成对比。
+--------------------------------------------------------------+-----------------------------------------------+
| Facade | Adapter |
+--------------------------------------------------------------+-----------------------------------------------+
| Simplifies multiple complex components with single interface | Provides differnet interface for an interface |
| Works with multiple components | Works with single component |
| Control panel is an example | A power adapter is an example |
| High-level interface | Low-level interface |
+--------------------------------------------------------------+-----------------------------------------------+
与往常一样,几种模式之间存在相似之处。但我会这样看:
我将不加任何形式地尝试用通俗易懂的方式对此进行解释。
假设您有一些域类,并且想要从UI中与它们进行交互。外观可用于提供可从UI层调用的功能,以便UI层不知道外观以外的任何域类。这意味着您无需在域类中调用函数,而可以从Facade中调用单个函数,而Facade将负责从其他类中调用所需的函数。
另一方面,适配器可用于集成其他外部组件,这些组件可能具有所需的相同功能,但调用它们的功能并不完全相同。假设您Car
在自己的域中有一个班级,并且与同时定义了Car类的外部汽车提供商一起工作。在此类中,您具有函数,car.getDoors()
但外部提供程序具有等效功能car.getNumDoors()
。您不想更改调用此函数的方式,因此可以使用适配器类包装外部Car类,以便getDoors()
将对适配器的调用委派给getNumDoors()
外部类。
正面
抽象复杂性以提供更简单的界面。例如,计算机操作系统抽象了底层硬件的复杂性。或者,与低级语言(C)相比,高级编程语言(Python / JavaScript)抽象了复杂性。
适配器
它类似于硬件适配器。假设您要将a连接USB device
到a serial port
,则需要一个USB-serial port adapter
。
适配器模式通过提供新接口来链接两个不兼容的接口。
外观模式可通过单个接口简化复杂的子系统(具有多个组件)。
这两种模式之间的区别很明显,但不是在设计模式领域,而是领域建模。在下文中,我将解释原因。
首先,我想重申其他人在这里所说的内容,然后再添加注释:
Facade是子系统(外部或旧系统)的接口,可简化客户端(美国)的访问。Facade隐藏其他子系统的接口(聚合一些调用,或隐藏一些我们不需要的API),因此您的客户端只能通过此Facade访问该子系统。
另一方面,适配器是另一个服务或对象的包装。它使包装的对象符合客户端期望的标准接口。假设在“分类帐”对象上有一个方法,您需要对其进行调整(更改其参数,更改其名称等)。您可以使用适配器包装它。
现在,区别可能还不清楚。这就是我要提出这两种模式之间的主要区别的地方,没有进一步混淆的空间:
Facade不会更改其他子系统的域模型,而Adapter会更改。 这是关键的区别。期。
这就是为什么在创建“ 反腐败层”时将这两者结合在一起的原因。假设您有要使用的子系统,但是您不希望其域模型混淆您的域模型。你会怎么做?您将创建一个反腐败层。怎么样?首先创建一个Facade,它简化了对子系统接口的访问,然后创建了该接口中使用的域对象的适配器(请记住,facade仍然保留了另一个子系统的域模型),因此它符合您的模型。
领域建模中可以使用许多设计模式。Facade和Adapter设计模式也是如此。尽管这两种模式之间的差异在“设计模式”领域中可能并不明确,但在“域建模”领域中则更为明显。