dev*_*ium 91 c# java design-patterns facade adapter
我一直在阅读这两个定义,它们似乎完全相同.任何人都可以指出他们的差异是什么?
谢谢
aws*_*ard 120
在外观模式的维基页面有关于这一个简短的说明.
"当包装器必须遵循特定的接口并且必须支持多态行为时,使用适配器.另一方面,当需要更简单或更简单的界面时,使用外观."
我听到一个类比,你应该想到你已经设置的通用遥控器可以与所有不同的立体声系统配合使用 - 你按下"打开"它就会打开你的有线电视盒,接收器和电视.也许它是一个非常奇特的家庭影院,它会使灯光变暗并且也会遮挡阴影.这是一个Facade - 一个按钮/功能,负责一系列更复杂的步骤.
Adapter模式只链接两个不兼容的接口.
编辑:适配器模式的快速类比(基于注释)可能类似于DVI-to-VGA适配器.现代视频卡通常是DVI,但你有一台旧的VGA显示器.使用适配器插入视频卡的预期DVI输入,并具有自己的VGA输入,您将能够使旧显示器使用新的视频卡.
Edw*_*uck 104
适配器==使方形钉适合圆孔.
Facade ==单个控制面板,用于运行所有内部组件.
小智 18
老实说,许多模式可以通过编程方式以相同的方式实现 - 差异在于意图.
适配器设计模式旨在将一个或多个类的接口"转换"为客户端期望使用的接口 - 适配器会将对预期接口的调用转换为包装类使用的实际接口.
当需要更简单的界面时,使用Facade模式(同样,可以通过包装违规类来实现相同的方式.)当现有界面不兼容时,您不会说您正在使用外观,只是在您需要时使其更具可读性,设计更差,等等.
Rav*_*abu 11
正面:
关键要点:(来自Pankaj Kumar的journaldev文章)
门面类图:
适配器:
适配器类图:
您可以在此SE帖子中找到有关适配器的更多详细信息:
主要差异:
看看源代码文章也是为了更好地理解.
这两种模式之间的区别很明显,但不是在设计模式领域,而是在领域建模领域。下面,我将解释原因。
首先,我想重申一下其他人在这里所说的,然后我将添加注释:
外观是子系统(外部或遗留系统)的接口,可简化客户端(我们)的访问。Facade隐藏了其他子系统的接口(聚合一些调用,或者隐藏一些我们不需要的API),因此您的客户端只能通过这个Facade访问该子系统。
另一方面,适配器是另一个服务或对象的包装器。它使包装的对象符合客户端期望的标准接口。假设“Ledger”对象上有一个方法,您需要对其进行调整(更改其参数、更改其名称等)。您可以用适配器将其包裹起来。
现在,差异可能仍然不清楚。这就是我想提出这两种模式之间的关键区别的地方,以免造成进一步混淆:
Facade 不会更改其他子系统的域模型,而 Adapter 会更改。 这是关键的区别。时期。
这就是为什么在创建Anticorruption Layer时将这两者结合起来的原因。假设您有一个想要使用的子系统,但您不希望它的域模型混淆您的域模型。你会怎么办?您将创建一个反腐败层。如何?您首先创建一个 Facade,它可以简化对子系统接口的访问,然后创建该接口中使用的域对象的适配器(请记住,Facade 仍然保存其他子系统的域模型),因此它符合您的模型。
许多设计模式都可以用于领域建模。对于外观和适配器设计模式来说也是如此。尽管这两种模式之间的区别在“设计模式”领域可能并不明显,但在“领域建模”领域则更加明显。
像往常一样,几种模式之间存在相似之处。但我会这样看:
外墙通常与适配器形成对比。
+--------------------------------------------------------------+-----------------------------------------------+
| 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)