外观,代理,适配器和装饰器设计模式之间有什么区别?
我从来没有看过清楚的解释,你是什么?
外观,代理,适配器和装饰器设计模式之间有什么区别?
我从来没有看过清楚的解释,你是什么?
Answers:
适配器使给定的类/对象适应新的接口。在前者的情况下,通常采用多重继承。在后一种情况下,对象由符合条件的适配器对象包装并传递。我们在这里要解决的问题是不兼容的接口。
Facade更像是通往一组复杂功能的简单网关。您为客户节省了很多麻烦,即使界面更简单。
代理提供与代理类相同的接口,并且通常自行完成一些内部管理工作。(因此,不是制作一个重对象的多个副本,而是制作X
一个轻量级代理的副本,该轻量级代理P
又X
根据需要管理和转换您的呼叫。)您正在解决客户端必须管理一个重和/或复杂对象的问题。
装饰器用于向您的对象添加更多的火药(请注意术语对象-通常在运行时动态地装饰对象)。您不会隐藏/削弱对象的现有接口,而只是在运行时对其进行扩展。
既然已经涉及到装饰器,您可能会想知道为什么强调单词对象的原因-有些语言(例如Java)根本不允许虚拟继承(即C ++允许多重继承)来允许您在以下位置完成此操作编译时间。
由于我们已经拖入了多个继承(以及可怕的菱形),因此您将寻找mixin-它们是接口的有序线性链接,可以解决多重继承的问题。但是,mixins混合得不好。最后,我们得到了特质 -是的,您一直在C ++的模板参数中看到的那些无状态的小斑点行为。特质试图以优雅的方式解决行为的组成和分解问题,而不是进行多重继承或有序链接。
正面
例如,您可以使用外观来简化对API的调用。看一下远程立面的这个例子。这里的想法是,服务器上代码的完整实现对客户端而言是隐藏的。客户端调用1个API方法,而该方法又可以在服务器上进行1个或多个API调用。
适配器
这方面的一个很好的例子可以发现在这里,在维基百科上。客户端对象Source
想在另一个对象上调用方法Target
,但是另一个对象的接口与客户端所期望的不同。
输入适配器对象。
可以接听 Source
对象然后在后台调用Target
应使用的方法。
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
至于代理,我对这种设计模式没有任何经验。