题 Facade,Proxy,Adapter和Decorator设计模式之间的区别? [关闭]


Facade,Proxy,Adapter和Decorator设计模式有什么区别?

我从来没有读过明确的解释,你的是什么?


110
2017-08-15 20:38


起源


stackoverflow.com/questions/18618779/... - gavenkoa
@gavenkoa另一个问题只是关于代理和装饰 - user310291
令人难以置信,因为一些封闭的问题显示自己如此有用 - Luke


答案:


适配器 使给定的类/对象适应新的接口。在前者的情况下,通常采用多重继承。在后一种情况下,对象由符合适配器的对象包裹并传递。我们在这里解决的问题是 不兼容的接口

正面 更像是一个复杂的功能集的简单网关。你做一个黑盒子让你的客户担心更少,即 使界面更简单

代理 提供与代理类相同的接口,并且通常自己做一些内务处理。 (因此,不要制作重物的多个副本 X 你制作一个轻量级代理的副本 P 反过来管理 X 并根据需要翻译你的电话。)你正在解决客户的问题 管理繁重和/或复杂的对象

装饰 用于向对象添加更多火药(注意术语对象 - 通常在运行时动态装饰对象)。您不会隐藏/损害对象的现有接口,但是 只需在运行时扩展它

既然你有装饰器,你可能想知道为什么强调单词对象 - 某些语言(如Java)根本不允许虚拟继承(即C ++的多重继承)允许你在编译时间。

由于我们拖了多个遗产(和可怕的钻石),你会留意 混入  - 哪个是 有序线性链接接口 解决多重继承的问题。但是,mixins不能很好地混合。我们最终得到了 性状  - 是的那些 无国籍的一点点行为 你在C ++中的模板参数中一直看到弹出窗口。特征试图以优雅的方式解决行为的构成和分解问题,而不是为了多重继承或有序链接。


246
2017-08-15 20:48



HTH!我试图尽可能多地投入,而不是太模糊。请原谅我无法做得更好。我已经阅读过关于特征的论文(博士论文)。因此,我的知识相当有限,我不足以适应这个空间的所有模式;) - dirkgently
你预计了关于mixins和traits的未来问题,但我还没有看到它们! - user310291
前三个(Decorator完全不同)的良好比较链接(通过维基百科): NetObjectives - Liviu
@Liviu你的链接已经死了。我假设你最初指的是 那里,但内容现在似乎落后于登录。 - Sheljohn
@Sheljohn链接更新:p:前三个(Decorator完全不同)的良好比较链接(通过维基百科) NetObjectives (阅读文本,请参阅“betweem”:“我在课堂上遇到的一个更常见的问题是”适配器,代理和外观之间的区别是什么?它们对我来说真的是相同的“。) - Liviu


正面

例如,您可以使用Facade来更轻松地调用API。看一眼 这个 远程门面的例子。这里的想法是服务器上的代码的完整实现隐藏在客户端之外。客户端调用1 API方法,该方法可以在服务器上进行1个或多个API调用。

适配器

可以找到一个很好的例子 这里,在维基百科上。客户端对象 Source 想在另一个对象上调用一个方法 Target,但是其他对象的界面与客户期望的不同。

输入适配器对象。

它可以接听电话 Source 对象,在幕后调用 Target应该使用的方法。

Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)

至于Proxy,我没有任何这种设计模式的经验。


15
2017-08-15 21:00