Facade和Adapter Pattern有什么区别?

时间:2010-06-02 20:21:24

标签: java c# design-patterns adapter facade

我一直在阅读这两个定义,它们似乎完全相同。任何人都可以指出他们的不同之处吗?

由于

16 个答案:

答案 0 :(得分:104)

Facade Pattern wiki页面有一个简短的说明。

  

“包装器时使用适配器   必须尊重特定的界面   并且必须支持多态   行为。另一方面,一个门面   当一个人想要一个更容易或   更简单的界面。“

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

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

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

答案 1 :(得分:94)

适配器==将方形钉固定在圆孔中。

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

答案 2 :(得分:17)

老实说,许多模式可以通过编程方式以相同的方式实现 - 不同之处在于意图。

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

当需要更简单的界面时,使用Facade模式(同样,可以通过包装有问题的类来实现相同的方式。)当现有界面不兼容时,你不会说你正在使用外观,只是当你需要使它更具可读性,设计不那么糟糕等等时

答案 3 :(得分:8)

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

答案 4 :(得分:8)

<强>门面:

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

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

    enter image description here

    <强>适配器:

    1. 这是结构模式
    2. 使用两个不兼容的接口
    3. 非常有用
    4. 在设计完成后

      适配器的类图:

      enter image description here

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

      Difference between Bridge pattern and Adapter pattern

      主要差异:

      1. Facade定义了一个新接口,而Adapter使用旧接口。适配器使两个现有接口协同工作,而不是定义一个全新的接口
      2. 适配器和Facade都是包装器;但它们是不同种类的包装纸。 Facade的目的是生成一个更简单的界面,而Adapter的目的是设计一个现有的界面
      3. 请查看sourcemaking文章,以便更好地理解。

答案 5 :(得分:4)

  

Facade通常与Adapter形成对比。

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

答案 6 :(得分:3)

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

  • 外观用于封装整个图层,并提供一些“方便”访问它的方法
  • 使用了一个适配器,其中有两个组件应该已经一起工作,但不是,只是因为界面中存在一些“不重要”的差异。

答案 7 :(得分:3)

我会用简单的语言解释这一点,但没有太多的形式。

想象一下,您有一些域类,并且您想要与UI进行交互。外观可用于提供可从UI层调用的功能,以便UI层不了解除外观之外的任何域类。这意味着不是调用域类中的函数,而是从外观调用单个函数,它将负责从其他类调用所需的函数。

另一方面,适配器可用于集成可能具有您需要的相同功能的其他外部组件,但它们的功能调用方式并不完全相同。假设您的域中有一个Car类,并且您正在使用已定义Car类的外部汽车提供商。在这个类中,您有函数car.getDoors()但外部提供者具有等效的car.getNumDoors()。您不希望更改调用此函数的方式,因此您可以使用适配器类来包装外部Car类,以便将对适配器的getDoors()的调用委派给getNumDoors()的外部课程。

答案 8 :(得分:2)

适配器模式允许两个以前不兼容的接口相互协作。有两个独立的界面。

Facade模式采用一个已知的接口,即低级别/细粒度,并使用更高级别/课程粒度接口进行包装。有一个单独的界面,通过包装另一个简化。

答案 9 :(得分:2)

适配器使两个接口协同工作。

Facade将单个类暴露给更高,更有限的级别。例如,视图模型外观可能只显示较低级别类的某些只读属性。

答案 10 :(得分:1)

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

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

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

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

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

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

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

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

答案 11 :(得分:0)

  

我一直在读这两个定义,它们看起来很相似。

真的吗?

我注意到术语 Adapter 有时用于描述实际上是 Stategy 的内容,可能是因为这个词更具表现力。

例如,在 Zend Framework 中,所有 Adapter 类实际上都是策略模式的实现,因为它们只包装本机代码在课堂后面,有几种行为。

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

答案 12 :(得分:0)

的目的

facade 简单

适配器互操作性

答案 13 :(得分:0)

外观

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

适配器

它类似于硬件适配器。假设您要将'error_code' => 0连接到USB device,则需要serial port

答案 14 :(得分:0)

适配器模式通过提供新接口来链接两个不兼容的接口。

门面模式简化了具有单个接口的复杂子系统(具有多个组件)。

答案 15 :(得分:0)

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