门面、代理、适配器和装饰器设计模式之间的区别?

正面代理适配器室内设计师设计模式的区别是什么?

从一般的观点来看,这样的模式似乎做同样的事情,即: 封装 API 并提供对它的访问

如何区分这些模式?
如何识别何时一种模式比其他模式更适合

77185 次浏览

Adapter 使给定的类/对象适应新的接口。就前者而言,通常是雇用多重继承。在后一种情况下,对象由符合要求的适配器对象包装并传递。我们在这里要解决的问题是 不兼容的接口的问题。

Facade 更像是一个通向复杂功能集的简单网关。你为你的客户创建了一个黑匣子,让他们少担心一些,比如 使接口更简单

Proxy 提供了与代理 for 类相同的接口,并且通常独立完成一些内务管理工作。(因此,您不需要复制重对象 X的多个副本,而是复制轻量级代理 P的副本,该代理反过来管理 X并根据需要转换调用。)你正在解决的问题,从客户端必须 管理沉重和/或复杂的物体

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

既然你已经涉及到了 decorator,你可能想知道为什么对单词 object 的强调——有些语言(比如 Java)就是不允许虚继承(比如像 C + + 那样的多重继承)允许你在编译时完成它。

既然我们已经引入了多个继承(以及可怕的钻石) ,那么就需要留意 Mixins——它就是 界面的有序线性连接,以避免出现多重继承问题。然而,Mixin 不能很好地混合。最后是 品质——是的,那些在 C + + 中模板参数中总是弹出的 无状态的小行为斑点。Traits 试图以一种优雅的方式解决行为的组合和分解问题,同时既不要求多重继承,也不要求有序链接。

正面

例如,您可以使用 facade 使对 API 的调用更加容易。看一下远程 facade 的 这个示例。这里的想法是,服务器上代码的完整实现隐藏在远离客户机的地方。客户端调用1个 API 方法,而这个方法又可以在服务器上进行1个或多个 API 调用。

适配器

维基百科上的 给你就是一个很好的例子。客户端对象 Source希望调用另一个对象 Target上的方法,但是该另一个对象的接口与客户端期望的接口不同。

输入适配器对象。

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

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

至于代理,我对这种设计模式没有任何经验。