design-patterns - Facade、Proxy、Adapter 和 Decorator 设计模式之间的区别?

标签 design-patterns proxy adapter decorator facade

外观代理适配器装饰器设计模式之间有什么区别?

从一般的角度来看,这些模式似乎做同样的事情,即:包装 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/

相关文章:

Ruby - 使用 WWW::Mechanize 和 NET::HTTP::GET 的 Socks4 代理

android - 从非 Activity 类调用 Activity

c# - MVP 被动 View ——保持 View 数据和模型数据分离

c# - 实体 VS 域模型 VS View 模型

c++ - 这个图案的名字是什么?

java - 如何使用代理启动selenium浏览器

rest - 将现有 GraphQL API 代理/转换为 REST

java - 自定义 ListView 上的 StartActivityForResult

android - ParseQueryAdapter "load more..."文本

.net - 为什么 Rectangle.Size 在每次调用时都会创建新实例?