外观,代理,适配器和装饰器设计模式之间的区别?[关闭]


135

外观,代理,适配器和装饰器设计模式之间有什么区别?

我从来没有看过清楚的解释,你是什么?



@gavenkoa另一个问题仅与代理和装饰器有关
user310291

2
令人难以置信的是,一些封闭的问题显示了自己如此有用。
路加福音

Answers:


285

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

Facade更像是通往一组复杂功能的简单网关。您为客户节省了很多麻烦,即使界面更简单

代理提供与代理类相同的接口,并且通常自行完成一些内部管理工作。(因此,不是制作一个重对象的多个副本,而是制作X一个轻量级代理的副本,该轻量级代理PX根据需要管理和转换您的呼叫。)您正在解决客户端必须管理一个重和/或复杂对象的问题

装饰器用于向您的对象添加更多的火药(请注意术语对象-通常在运行时动态地装饰对象)。您不会隐藏/削弱对象的现有接口,而只是在运行时对其进行扩展

既然已经涉及到装饰器,您可能会想知道为什么强调单词对象的原因-有些语言(例如Java)根本不允许虚拟继承(即C ++允许多重继承)来允许您在以下位置完成此操作编译时间。

由于我们已经拖入了多个继承(以及可怕的菱形),因此您将寻找mixin-它们是接口的有序线性链接,可以解决多重继承的问题。但是,mixins混合得不好。最后,我们得到了特质 -是,您一直在C ++的模板参数中看到的那些无状态的小斑点行为。特质试图以优雅的方式解决行为的组成和分解问题,而不是进行多重继承或有序链接。


1
HTH!我尽力不遗余力地尽我所能。请原谅我做不到。我仅阅读过有关特质的(博士学位论文)论文。因此,我的知识非常有限,我不足以适应该空间中的所有模式;)
奇怪的是,2010年

您预料到将来会出现关于混合素和特性的问题,但我还没有看到它们!
user310291'2010-08-21

1
前三个很好的比较链接(通过Wikipedia)(装饰器完全不同): NetObjectives
Liviu 2013年

@Liviu您的链接已死。我假设您最初指向的是那里,但现在的内容似乎在登录之后。
乔纳森·H

@Sheljohn链接已更新:p:前三个(Decorator完全不同)NetObjectives的一个很好的比较链接(通过Wikipedia)(检索文本,请参见“ betweem”):“我在课堂上遇到的最常见的问题之一是“适配器,代理服务器和外立面之间的区别?在我看来,它们真的一样。”
Liviu

16

正面

例如,您可以使用外观来简化对API的调用。看一下远程立面的这个例子。这里的想法是,服务器上代码的完整实现对客户端而言是隐藏的。客户端调用1个API方法,而该方法又可以在服务器上进行1个或多个API调用。

适配器

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

输入适配器对象。

可以接听 Source对象然后在后台调用Target应使用的方法。

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

至于代理,我对这种设计模式没有任何经验。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.