组成与立面模式

时间:2018-07-01 18:12:37

标签: design-patterns composition facade

我找到了一个使我更了解课堂构成的答案。

class Engine
{

}

class Automobile
{

}


class Car extends Automobile // car "is a" automobile //inheritance here
{ 
 Engine engine; // car "has a" engine //composition here

}

但这不是门面图案吗?外观不是通过划分子类来简化类吗?那么构图和立面之间有什么区别?

或者也许我理解错了。外墙是一种设计模式,但构图更像是一种可遵循的好习惯。我们可以说使用立面进行合成吗?

2 个答案:

答案 0 :(得分:0)

合成将具有相同API的对象中的N个其他对象组合在一起。因此,您可以在复合对象及其组件上调用相同的方法。

Facade看起来好像做了一些非常相似的事情,但是我认为它解除了复合对象必须符合相同API的限制。 Facade的全部要点是包装器和包装器的API可以不同。

您显示的示例既不是正式的Composite也不是Facade,但是如果您采用Composite的最开放定义,则它可能是一个:“一个对象,其中其他对象作为对象对其执行操作。”

答案 1 :(得分:0)

外观模式是一种设计模式,用于将不适合您当前需求的界面更改为更有用的界面。它完全封装了另一个接口,而不暴露它。

一些使用示例:

  • 无法在.NET中轻松模拟File.Copy(),所以我编写了一个使用虚拟方法委派给它的外观,因此我可以模拟该外观。
  • 使用第三方库时,您可能不想允许耦合到该库中的类型,因此您编写了一个Facade来封装这些类型,而只公开您的副本
  • 您要使用的类可能有很多方法,但是您只需要几个即可。可以在这少数几个表面上编写外观,以提供更简单的界面。
  • 服务类可能具有奥秘用法(“要启用抗锯齿时在-19438中作为第二个参数传递”),您不需要在代码中包含所有选项。在此类上创建一个更易于使用的Facade,以提高核心代码的可读性。