Facade和Adapter Pattern有什么区别?

dev*_*ium 91 c# java design-patterns facade adapter

我一直在阅读这两个定义,它们似乎完全相同.任何人都可以指出他们的差异是什么?

谢谢

aws*_*ard 120

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

"当包装器必须遵循特定的接口并且必须支持多态行为时,使用适配器.另一方面,当需要更简单或更简单的界面时,使用外观."

我听到一个类比,你应该想到你已经设置的通用遥控器可以与所有不同的立体声系统配合使用 - 你按下"打开"它就会打开你的有线电视盒,接收器和电视.也许它是一个非常奇特的家庭影院,它会使灯光变暗并且也会遮挡阴影.这是一个Facade - 一个按钮/功能,负责一系列更复杂的步骤.

Adapter模式只链接两个不兼容的接口.

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

  • 使用遥控器的很好的比喻.适配器模式说明没问题,但是想出相同的类比会很棒. (4认同)
  • 确实很好的比喻!适配器模式的真实Java示例可能有助于更好地理解它:[`InputStreamReader`](http://java.sun.com/javase/6/docs/api/java/io/InputStreamReader.html)适应` InputStream`到`Reader`和[`OutputStreamWriter`](http://java.sun.com/javase/6/docs/api/java/io/OutputStreamWriter.html),它将`OutputStream`改编为`Writer`两者是不同的抽象类型. (2认同)

Edw*_*uck 104

适配器==使方形钉适合圆孔.

Facade ==单个控制面板,用于运行所有内部组件.

  • 这个答案是完美的!我把它包含在我的模式笔记中.:) (6认同)
  • 简单中的伟大 (2认同)

Vla*_*nea 20

的目的

门面简单

适配器互操作性的


小智 18

老实说,许多模式可以通过编程方式以相同的方式实现 - 差异在于意图.

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

当需要更简单的界面时,使用Facade模式(同样,可以通过包装违规类来实现相同的方式.)当现有界面不兼容时,您不会说您正在使用外观,只是在您需要时使其更具可读性,设计更差,等等.


Mik*_*ton 11

Facade旨在组织单个服务网关后面的多个服务.适配器旨在提供使用已知接口访问未知接口的方法.


Rav*_*abu 11

正面:

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

  1. Facade模式更像是客户端应用程序的帮助
  2. Facade模式可以应用于任何开发点,通常是当接口数量增加且系统变得复杂时.
  3. 子系统接口不知道Facade,它们不应该有Facade接口的任何引用
  4. Facade模式应该应用于类似的接口,其目的是提供单个接口而不是多个接口来完成类似的工作

门面类图:

在此输入图像描述

适配器:

  1. 这是一种结构模式
  2. 使用两个不兼容的接口很有用
  3. 使它们在设计之后起作用

适配器类图:

在此输入图像描述

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

桥模式和适配器模式之间的差异

主要差异:

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

看看源代码文章也是为了更好地理解.


Ari*_*deh 9

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

首先,我想重申一下其他人在这里所说的,然后我将添加注释:

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

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

现在,差异可能仍然不清楚。这就是我想提出这两种模式之间的关键区别的地方,以免造成进一步混淆

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

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

许多设计模式都可以用于领域建模。对于外观和适配器设计模式来说也是如此。尽管这两种模式之间的区别在“设计模式”领域可能并不明显,但在“领域建模”领域则更加明显。


Chr*_*her 6

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

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

  • 很好的解释。这是我第一次在描述适配器时遇到“不重要的差异”这个词,这实际上是正确的 (2认同)

Pre*_*raj 5

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

+--------------------------------------------------------------+-----------------------------------------------+
|                            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                           |
+--------------------------------------------------------------+-----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)