门面,代理,适配器和装饰devise模式之间的区别?
Facade,Proxy,Adapter和Decoratordevise模式有什么区别?
我从来没有读过一个清楚的解释,你的是什么?
适配器将给定的类/对象调整为新的界面。 在前者的情况下,通常使用多重inheritance。 在后一种情况下,该对象被一个符合的适配器对象包裹并传递。 我们在这里解决的问题是不兼容的接口 。
Facade更像是一个复杂function集的简单入口。 你为你的客户制作一个黑盒子让你更less担心,即使接口更简单 。
代理服务器提供与代理服务器类相同的接口,并且通常会自行完成一些pipe理工作。 (所以,不要制作一个沉重的对象X
多个副本,而是制作一个轻量级代理P
副本,然后再pipe理X
并根据需要翻译您的调用。)您正在解决客户端无法pipe理沉重和/或复杂的对象 。
装饰器是用来添加更多的火药到你的对象(注意术语对象 – 你通常在运行时dynamic装饰对象)。 您不会隐藏/损害对象的现有接口, 只是在运行时扩展它 。
现在你有了装饰器,你可能想知道为什么强调单词对象 – 一些语言(如Java)不允许虚拟inheritance(即C ++所做的多inheritance)来允许你在编译时间。
由于我们已经拖累了多重inheritance(以及令人畏惧的钻石),所以你会注意到mixin – 它是有序的线性链接接口来解决多重inheritance的问题。 然而,mixin混合不好。 而且我们最终得到的是特性 – 是那些在C ++的模板参数中总是popup的无状态的小行为 。 性状试图以优雅的方式解决行为的构成和分解问题,而不是为了多重inheritance或有序的链接。
正面
例如,您可以使用Facade来更方便地调用API。 看看这个远程外观的例子。 这里的想法是,服务器上代码的完整实现隐藏在客户端之外。 客户端调用1个API方法,然后在服务器上进行1个或多个API调用。
适配器
维基百科上可以find一个很好的例子。 客户端对象Source
想调用另一个对象Target
上的方法,但是其他对象的接口与客户端所期望的不同。
input适配器对象。
它可以接受来自Source
对象的调用,并在幕后调用应该使用的Target
方法。
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
至于代理,我没有任何这种devise模式的经验。