Composite Pattern优于简单继承的好处

时间:2011-03-17 09:34:41

标签: design-patterns

我试图弄清楚为什么复合比简单的继承更好。

例如,假设我们要实现一个文件系统。 所以基本上我们需要文件和文件夹。 我们可以使用复合模式,而FileFolder类继承基接口,Folder类包含接口类型集合。

但是(无论如何)看起来简单的继承可以做同样的事情。 如果File是根类,Folder继承自File,则Folder可以保存File的集合,即故事结束。

我错过了什么吗?

4 个答案:

答案 0 :(得分:7)

  

如果File是根类而Folder继承File,则Folder可以包含Files

的集合

这基本上是复合模式,即使你没有这样称呼它: - )

除了在您的变体中,Folder将继承特定于文件的功能,但不能(或更糟:不应该)使用。因此,您最终会使实施变得复杂化以确保客户端无法将字节附加到文件夹的“结尾”等。

仅供参考,GoF书的续集Pattern Hatching讨论了使用各种模式(包括Composite)实现文件系统的过程。强烈推荐阅读。

答案 1 :(得分:0)

在您的示例中,一个重要的区别变得明显。在大多数语言中,继承是一种编译时机制。您可以在源代码中定义类的关系。

组合通常与继承相结合(而不是polymorphism)。如果部件具有多态接口,则可以在运行时决定如何组成复杂对象。

最后,它取决于使用的语言。在C ++中,继承只应用于多态,never for code-reuse。在像Python这样的语言中,这不是真的。在这里,你可以通过组合和继承来实现同样的目标。

答案 2 :(得分:0)

我建议你使用Head First Design Patterns一书,第一章名为Intro to Design Patterns讨论策略模式,有一个非常详细的例子,你可以自己找出有关组合以及为什么我们喜欢组合而不是继承。 / p>

答案 3 :(得分:0)

我建议你更好地通过这个pdf: - http://userpages.umbc.edu/~tarr/dp/lectures/Composite-2pp.pdf这个pdf肯定会帮助你。感谢。