外墙和适配器图案有什么区别?


Answers:


142

外观模式的维基页面有关于这一个简短的说明。

“当包装器必须遵循特定的接口并且必须支持多态行为时,将使用适配器。另一方面,当人们希望使用更简单或更简单的接口时,将使用外观。”

我听到一个类比,您应该想到已设置为可与所有不同的立体声系统配合使用的通用遥控器-按下“开”,它会打开电缆盒,接收机和电视。也许这是一个真正的高档家庭影院,它可以调暗灯光并绘制阴影。这是一个Facade-一个按钮/功能,需要执行一系列更复杂的步骤。

适配器模式仅链接两个不兼容的接口。

编辑:适配器模式的快速类比(基于注释)可能类似于DVI-VGA适配器。现代视频卡通常是DVI,但您有一个旧的VGA显示器。通过将适配器插入视频卡预期的DVI输入并具有自己的VGA输入的适配器,您将能够使旧显示器与新视频卡一起使用。


4
使用遥控器进行类比。适配器模式的解释是可以的,但是提出相同的类比将是很棒的。
Kevin Le-Khnle 2010年

2
确实是一个很好的类比!Adapter模式的真实Java示例可以帮助您更好地理解它:InputStreamReader适应InputStreamReader并且OutputStreamWriter适应OutputStreamWriter两者都是不同的抽象类型。
BalusC 2010年


@Khnle-在适配器类比中添加(基于个人经验)。@Eric-感谢您的灵感和精彩图片!@BalusC-现实世界中的好例子。
awshepard 2010年

@BalusC-我也喜欢你的例子。幸运的是我知道Java。@Eric Petroelje-一幅画值得一千个单词:-) @awshepard-如果我不编程,我现在也可以按照你的解释:-)
Kevin Le-Khnle 2010年

125

适配器==使一个方形的钉子适合一个圆孔。

外立面==一个用于运行所有内部组件的控制面板。


8
这个答案简直太完美了!我将其包括在样式注释中。:)
约书亚·戴尔

1
简单性
一个人

20

老实说,可以通过编程方式以相同的方式实现许多模式-差异的目的是。

适配器设计模式旨在将一个或多个类的接口“转换”为客户端希望使用的接口-适配器会将对预期接口的调用转换为包装的类使用的实际接口。

当需要一个更简单的接口时,可以使用Facade模式(同样,可以通过包装有问题的类以相同的方式实现)。当现有接口不兼容时,您不会说您在使用Facade,只是在需要时使其更具可读性,设计欠佳等。


18

正面:

关键要点:(摘自 Pankaj Kumar的journaldev文章)

  1. 外观模式更像是客户端应用程序的助手
  2. 可以在任何开发点应用外观模式,通常是在接口数量增加和系统变得复杂时使用
  3. 子系统接口不了解Facade,因此不应具有Facade接口的任何引用
  4. 外墙模式应应用于相似类型的接口,其目的是提供一个单一的接口,而不是提供多个执行相似类型工作的接口

外立面类图:

在此处输入图片说明

适配器:

  1. 这是一种结构模式
  2. 使用两个不兼容的接口很有用
  3. 使事情的工作,他们正在设计的后

适配器的类图:

在此处输入图片说明

您可以在此SE帖子中找到有关适配器的更多详细信息:

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

主要区别:

  1. Facade定义了一个新接口,而Adapter使用了旧接口。适配器使两个现有接口协同工作,而不是定义一个全新的接口
  2. Adapter和Facade都是包装器;但是它们是不同种类的包装器。Facade的目的是产生一个更简单的界面,而Adapter的目的是设计到现有的界面

也可以查看有关源制作的文章,以更好地理解。


喜欢看图表!不过,仅需澄清一下,当我更改参数的数量/类型时,是否表示它不再是适配器了?像是someMethod(int year, int month) 被委派给someMethod(DateTime start, DateTime end)或说被someMethod()委派给了someMethod(T param)
Jaime Sangcap

如果两个方法都在同一类中,则称为重载。如果他们在不同的班级,也可以是adpater如果适配器和适配者的关系中实现
拉温德拉巴布

真的很好的解释。
Duc Filan

14

外观设计用于在单个服务网关后面组织多个服务。适配器旨在提供一种使用已知接口访问未知接口的方法。



8

外墙通常与适配器形成对比。

+--------------------------------------------------------------+-----------------------------------------------+
|                            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                           |
+--------------------------------------------------------------+-----------------------------------------------+

4

与往常一样,几种模式之间存在相似之处。但我会这样看:

  • 外墙用于封装整个图层,并提供一些“方便”访问它的方法
  • 使用适配器时,您有两个组件应该已经一起工作,但不能一起工作,这仅仅是因为接口中存在一些“不重要”的差异。

1
很好的解释。这是我第一次在描述适配器时遇到“不重要的差异”一词,这实际上是真的
Sudara

4

我将不加任何形式地尝试用通俗易懂的方式对此进行解释。

假设您有一些域类,并且想要从UI中与它们进行交互。外观可用于提供可从UI层调用的功能,以便UI层不知道外观以外的任何域类。这意味着您无需在域类中调用函数,而可以从Facade中调用单个函数,而Facade将负责从其他类中调用所需的函数。

另一方面,适配器可用于集成其他外部组件,这些组件可能具有所需的相同功能,但调用它们的功能并不完全相同。假设您Car在自己的域中有一个班级,并且与同时定义了Car类的外部汽车提供商一起工作。在此类中,您具有函数,car.getDoors()但外部提供程序具有等效功能car.getNumDoors()。您不想更改调用此函数的方式,因此可以使用适配器类包装外部Car类,以便getDoors()将对适配器的调用委派给getNumDoors()外部类。


3

适配器模式允许两个以前不兼容的接口相互配合。有2个单独的界面在起作用。

Facade模式采用一个已知的接口,该接口是低级别/细粒度的,并用较高级别/课程粗粒度的接口将其包装。具有单个接口,通过包装另一个接口可以简化此接口。


3

适配器使两个接口一起工作。

外立面将单个类暴露给更高且更受限制的级别。例如,视图模型外观可能仅公开较低级别类的某些只读属性。


1

正面

抽象复杂性以提供更简单的界面。例如,计算机操作系统抽象了底层硬件的复杂性。或者,与低级语言(C)相比,高级编程语言(Python / JavaScript)抽象了复杂性。

适配器

它类似于硬件适配器。假设您要将a连接USB device到a serial port,则需要一个USB-serial port adapter



1

这两种模式之间的区别很明显,但不是在设计模式领域,而是领域建模。在下文中,我将解释原因。

首先,我想重申其他人在这里所说的内容,然后再添加注释:

Facade是子系统(外部或旧系统)的接口,可简化客户端(美国)的访问。Facade隐藏其他子系统的接口(聚合一些调用,或隐藏一些我们不需要的API),因此您的客户端只能通过此Facade访问该子系统。

另一方面,适配器是另一个服务或对象的包装。它使包装的对象符合客户端期望的标准接口。假设在“分类帐”对象上有一个方法,您需要对其进行调整(更改其参数,更改其名称等)。您可以使用适配器包装它。

现在,区别可能还不清楚。这就是我要提出这两种模式之间的主要区别的地方,没有进一步混淆的空间

Facade不会更改其他子系统的域模型,而Adapter会更改。 这是关键的区别。期。

这就是为什么在创建“ 反腐败层”时将这两者结合在一起的原因。假设您有要使用的子系统,但是您不希望其域模型混淆您的域模型。你会怎么做?您将创建一个反腐败层。怎么样?首先创建一个Facade,它简化了对子系统接口的访问,然后创建了该接口中使用的域对象的适配器(请记住,facade仍然保留了另一个子系统的域模型),因此它符合您的模型。

领域建模中可以使用许多设计模式。Facade和Adapter设计模式也是如此。尽管这两种模式之间的差异在“设计模式”领域中可能并不明确,但在“域建模”领域中则更为明显。


0

我一直在阅读这两个定义,它们似乎完全一样。

真的吗

我注意到,有时使用适配器一词来描述实际上是Stategy的东西,也许是因为该词更具表现力。

例如,在Zend Framework中,所有Adapter类实际上都是Strategy模式的实现,因为它们仅将本机代码包装在类后面,从而具有多种行为。

适配器通常用于包装旧式或“旧式”代码。


0

Facade模式的主要目标是使类或子系统更易于使用,而Adapter模式的主要目标是使接口适应客户的期望。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.