【问题标题】: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,以提高核心代码的可读性。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2012-11-08
      • 2012-11-16
      • 2016-12-25
      • 2019-07-30
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多