门面和适配器模式有什么区别?
我一直在阅读这两个定义,他们看起来完全一样。 任何人都可以指出他们的区别是什么?
谢谢
Facade Pattern维基页面有一个关于这个的简要说明。
“包装器必须尊重特定的接口,并且必须支持多态行为时才使用适配器。另一方面,当需要更容易或更简单的接口来使用时,使用外观。
我听到一个类比,你应该考虑一下你已经设置好的通用遥控器,以便与所有不同的立体声系统一起工作 – 按下“打开”,打开有线电视盒,接收器和电视机。 也许这是一个非常花哨的家庭影院,它可以使灯光变暗,也可以画出阴影。 这是一个外观 – 一个button/function,照顾一个更复杂的一套步骤。
适配器模式只是链接两个不兼容的接口。
编辑:一个适配器模式(基于评论)的快速比喻可能是像一个DVI到VGA适配器。 现代的video卡通常是DVI,但是你有一个旧的VGA显示器。 使用可插入显卡预期DVIinput的适配器,并具有自己的VGAinput,可以使旧显示器与新显卡一起工作。
适配器==使一个正方形钉适合一个圆孔。
Facade ==一个控制面板来运行所有的内部组件。
老实说,许多模式可以以编程的方式实现 – 差异是有意的。
适配器devise模式旨在将一个或多个类的接口“翻译”为客户端期望使用的接口 – 适配器将把调用转换为期望的接口,并将其转换为包装类使用的实际接口。
Facade模式在需要更简单的接口时使用(再次,可以通过包装违规类以相同的方式实现)。当现有接口不兼容时,您不会说使用外观,只是在需要时使其更具可读性,devise更less等。
门面被devise成在单个服务网关后面组织多个服务。 适配器旨在提供一种使用已知接口访问未知接口的方法。
正面:
关键要点:(来自Pankaj Kumar的journaldev文章)
- 门面模式更像是客户端应用程序的助手
- 通常当接口数量增加,系统变得复杂时 ,门面模式可以应用于任何开发阶段。
- 子系统接口不知道Facade,他们不应该有任何Facade接口的引用
- 门面模式应该应用于类似types的接口 ,其目的是提供一个单一的接口,而不是多个接口做类似的工作
门面类图:
适配器:
- 这是一个结构模式
- 使用两个不兼容的接口是很有用的
- 它在devise完成之后会使其工作
适配器类图:
你可以在这篇SE文章中find关于Adapter的更多细节:
桥接模式和适配器模式之间的区别
主要区别:
- Facade定义了一个新的接口,而Adapter使用了一个旧的接口 。 适配器使得两个现有的接口一起工作,而不是定义一个全新的接口
- 适配器和外观都是包装; 但是它们是不同types的包装。 Facade的目的是产生一个更简单的接口,Adapter的目的是devise一个现有的接口
为了更好的理解,也看看源文章。
像往常一样,几种模式之间存在相似之处。 但我会看到这样的:
- 一个门面是用来封装整个图层,并提供一些方法来访问它“方便”
- 使用了一个适配器,在这个适配器中,有两个组件应该已经一起工作,但是不要,只是因为接口中有一些“不重要的”区别。
我会尽量用简单的话来解释,没有太多的forms。
想象一下,你已经有了一些领域类,并从你想要与他们交互的用户界面。 可以使用Facade来提供可以从UI层调用的函数,以便UI层不知道除了Facade以外的任何域类。 这意味着不要调用域类中的函数,而是从外观调用单个函数,这将负责从其他类调用所需的函数。
另一方面,适配器可用于集成其他可能具有相同function的外部组件,但其function调用方式不尽相同。 假设你在你的领域有一个Car
类,并且你也有一个Car类定义的外部汽车供应商。 在这个类中,你有car.getDoors()
函数,但是外部提供者有相同的car.getNumDoors()
。 您不希望更改调用此函数的方式,因此可以使用适配器类来包装外部Car类,以便将适配器的getDoors()
调用委托给外部类的getNumDoors()
。
适配器模式允许两个以前不兼容的接口相互配合工作。 有2个独立的接口在玩。
Facade模式采用一个已知的界面,即低级别/细粒度,并用更高级别/过程粒度界面进行包装。 有一个单一的界面,通过与另一个包装简化。
适配器使两个接口一起工作。
Facade将单个课程暴露给更高和更有限的水平。 例如,一个视图模型外观可能只暴露一些较低级别的只读属性。
我一直在阅读这两个定义,他们看起来完全一样。
真的?
我注意到适配器这个词有时用来描述什么是一个Stategy ,也许是因为这个词更具performance力。
例如,在Zend Framework中 ,所有Adapter类实际上都是Strategy模式的实现,因为它们只是将本地代码包装在类后面,以便具有多种行为。
适配器通常用于包装传统或“旧式”代码。