【问题标题】:Composition vs facade pattern构图与立面模式
【发布时间】:2018-07-01 18:12:36
【问题描述】:
我发现一个回答让我对类组合有了更多的了解。
class Engine
{
}
class Automobile
{
}
class Car extends Automobile // car "is a" automobile //inheritance here
{
Engine engine; // car "has a" engine //composition here
}
但这不是外观模式吗?门面不是通过划分子类来使类更简单吗?那么构图和立面有什么区别呢?
或者我弄错了。外观是一种设计模式,但组合更像是一种可以遵循的良好实践。能不能说用facade就是在做composition?
【问题讨论】:
标签:
design-patterns
composition
facade
【解决方案1】:
Composition 将具有相同 API 的对象中的 N 个其他对象组合在一起。因此,您可以在复合对象及其组件上调用相同的方法。
Facade 似乎做了一些非常相似的事情,但我认为它解除了复合对象必须符合相同 API 的限制。 Facade 的全部意义在于 wrapper 和 Wrapper 的 API 可以不同。
您展示的示例既不是正式的 Composite 也不是 Facade,但如果您采用 Composite 的最开放定义,那么它可能是一个:“具有其他对象作为其执行操作的成员的对象。”
【解决方案2】:
外观模式是一种设计模式,用于将不适合您当前需求的界面更改为更有用的界面。它完全封装了另一个接口,而不是暴露它。
一些使用示例:
- File.Copy() 无法在 .NET 中轻松模拟,因此我编写了一个使用虚拟方法委托给它的外观,因此我可以模拟该外观。
- 使用 3rd 方库时,您可能不希望允许耦合到该库中的类型,因此您编写了一个外观来封装这些类型,并且只公开您的副本
- 您要使用的类可能有大量的方法,但您只需要几个。可以在这几个部分上编写外观以提供更简单的界面。
- 一个服务类可能有神秘的用法(“当您想要启用抗锯齿功能时,将 -19438 作为第二个参数传入”),您不需要在代码中包含所有选项。在此类之上创建一个更易于使用的 Facade,以提高核心代码的可读性。