Facade,Proxy,Adapter和Decorator设计模式之间有什么区别?
我从来没有读过明确的解释,你的是什么?
答案 0 :(得分:262)
适配器使给定的类/对象适应新的接口。在前者的情况下,通常采用多重继承。在后一种情况下,对象由一致的适配器对象包裹并传递。我们在这里解决的问题是不兼容的接口。
Facade 更像是一个复杂功能集的简单网关。你为客户制作了一个黑盒子,不用担心,使界面更简单。
代理提供与proxied-for类相同的界面,并且通常会自行执行一些内务处理。 (因此,您不必制作重型对象X
的多个副本,而是制作轻量级代理P
的副本,然后根据需要管理X
并转换您的调用。)您正在解决问题客户必须管理繁重和/或复杂的对象。
装饰器用于向对象添加更多火药(注意术语对象 - 通常在运行时动态装饰对象)。您不会隐藏/损害对象的现有接口,但只是在运行时扩展它。
既然你有装饰器,你可能想知道为什么强调单词对象 - 某些语言(如Java)根本不允许虚拟继承(即C ++的多重继承)允许你在编译时完成此任务。
由于我们拖了多个遗产(和可怕的钻石),你会留意 mixins - 这是有序线性链接接口以解决问题多重继承。然而,mixins不能很好地混合。我们最终得到了 traits - 是那些无状态的小行为,你会在C ++中的模板参数中看到弹出窗口。 Traits试图以优雅的方式解决行为的构成和分解问题,而不是为了多重继承或有序链接。
答案 1 :(得分:16)
<强>门面强>
例如,您可以使用外观来更轻松地调用API。看一下远程外观的this示例。这里的想法是服务器上的代码的完整实现隐藏在客户端之外。客户端调用1 API方法,该方法可以在服务器上进行一次或多次API调用。
<强>适配器强>
在维基百科上可以找到一个很好的例子here。客户端对象Source
想要在另一个对象Target
上调用一个方法,但该另一个对象的接口与客户端所期望的不同。
输入适配器对象。
可以从Source
对象进行调用,在幕后调用应该使用的Target
方法。
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
至于代理,我没有任何这种设计模式的经验。