Facade,Proxy,Adapter和Decorator设计模式之间的区别?

use*_*291 125 proxy design-patterns facade decorator adapter

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

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

dir*_*tly 271

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

Facade更像是一个复杂的功能集的简单网关.您为客户制作了一个黑盒子,以减少担心,即简化界面.

代理提供与代理类相同的接口,并且通常自己做一些内务处理.(因此,您不必制作重型对象的多个副本,而是制作X轻量级代理的副本,P然后X根据需要管理和转换您的调用.)您正在解决客户端必须管理繁重和/或复杂对象的问题.

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

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

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


Jas*_*ans 16

正面

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

适配器

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

输入适配器对象.

它可以接受来自Source对象的调用,并在后台调用Target应该使用的方法.

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

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