外观、代理、适配器和装饰器设计模式之间有什么区别?
从一般的角度来看,这些模式似乎做同样的事情,即:包装 API 并提供对其的访问。
如何区分这些模式?
如何辨别一种模式何时比其他模式更适合?
最佳答案
适配器使给定的类/对象适应新的接口(interface)。对于前者,通常采用多重继承。在后一种情况下,对象由一致的适配器对象包装并传递。我们在这里解决的问题是不兼容的接口(interface)。
外观更像是通往一组复杂功能的简单网关。您为您的客户创建了一个黑匣子,以减少他们的担忧,即使界面更简单。
Proxy 提供与代理类相同的接口(interface),并且通常自行执行一些内务处理工作。 (因此,您不必制作重对象 X
的多个副本,而是制作轻量级代理 P
的副本,后者依次管理 X
并转换您的调用根据需要。)您正在解决客户端必须管理沉重和/或复杂的对象的问题。
装饰器用于为您的对象添加更多火药(注意术语“对象”——您通常在运行时动态装饰对象)。您不会隐藏/损害对象的现有接口(interface),而是简单地在运行时扩展它。
现在你已经涉及到装饰器了,你可能想知道为什么要强调对象这个词——一些语言(比如 Java)根本不允许虚拟继承(即像 C++ 那样的多重继承)来允许你在编译时完成此操作。
由于我们已经引入了多重继承(以及可怕的菱形),因此您需要注意混合——它们是接口(interface)的有序线性链接来解决问题的多重继承。然而,mixin 的混合效果不太好。我们最终得到了特征——是的,那些无状态的行为小 Blob ,你总是在C++的模板参数中看到弹出的。特征试图以优雅的方式解决行为的组合和分解问题,而不是多重继承或有序链接。
关于design-patterns - Facade、Proxy、Adapter 和 Decorator 设计模式之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3489131/