为什么以及何时应该“提取复合”而不是“提取超类”

时间:2014-02-19 19:40:25

标签: design-patterns composite

我正在读一本名为Refactoring to Patterns的书,在本书中有一节标题为:Extract Composite(第214页)。

它的建议是,如果一堆子类具有共同的功能,您应该将该功能提取到新的超类。这听起来很直接。

Extract CompositeExtract Superclass之间的区别是什么?

那么,根据阅读和图表......复合应该是你的子类的 new 超类。请参见下图:

enter image description here

问题: 创建一个新的“CompositeTag”超类的目的是什么?为什么不想将代码复制移动到其原始基类(Node)?

2 个答案:

答案 0 :(得分:1)

以下是WPF中VisualUIElement的类比。让我们假设我们正在开发一些控件,我们发现(出于任何奇怪的原因)我们没有鼠标事件,并且那些按钮需要它们。

我们可以将鼠标事件放在Visual中,或者我们可以将它们放在UIElement中。因为将鼠标事件放在不属于GUI的东西上是没有意义的,所以它在逻辑上属于UIElement,这就是我们放置它们的地方。

回答:语义,尤其是单一责任原则。 Visual应该注意效果和变换之类的内容,而UIElement应该注意焦点和输入等。

我试图提供一个更相关的例子,但我没有一套具体的课程可供使用。如果您可以在逻辑上将功能分离为自包含的子类,那么一定要这样做。

答案 1 :(得分:1)

我希望我的副本很方便,但我会说“Extract Composite”是“Extract Superclass”的一个特例。composite是一种特定类型的继承关系,我想作者觉得它需要单独调出。该图确实说明了通常使用复合材料完成的操作。我认为在给出的示例中,并非所有子类都是复合的,因此无法将功能拉入基类。尽管如此,它确实感觉有点像作者只是填写了这本书:)