在叶节点中具有自定义操作的复合模式

时间:2014-08-14 17:11:45

标签: java design-patterns composite

我试图使用复合模式重构树状结构。但是,它似乎并不完全符合模式要求:

  • 不同类型的叶节点是可能的:它们的属性和操作(方法)不同
  • 不同类型的复合对象是可能的:它们的属性和操作不同并且有一些约束(例如:Composite1对象不能是Composite2子对象; Composite2对象可以是Composite1子对象)

情况如下图所示: Composite with different leaves

所以,我想知道哪个是最好的解决方案:

  1. 由于树叶和复合材料界面已经不同 和节点操作操作在复合中实现 我正在考虑实现一些操作 isComposite1() isComposite2()并使用上面的模式。
  2. 我还可以在抽象类中实现节点操作操作 也属于不同叶子的那些;然后我可以 如果他们不属于,则使用不执行任何操作的操作来覆盖它们 那个班。这样,界面对于所有人来说都是相同的 我可以用同样的方式处理所有节点......
  3. 也许Composite不是这里使用的模式?我读了一些文章 建议复合+访客。这对它有用吗? 结构体?也许架构有太多的限制和 约束
  4. 欢迎任何指导或建议......

    提前致谢。

    修改

    在仔细考虑@Waog响应,阅读有关该主题的更多参考资料并再次考虑我的问题后,我认为合理的解决方案可能如下所示:

    Node接口,用于组成不同类型节点的结构和特定接口(是叶子,是复合的)。此外,在需要时使用抽象类提供默认实现。下面是最终情况的图表:

    proposed final design diagram

    非常感谢@Waog的想法和解释。我希望我有这个主意......

1 个答案:

答案 0 :(得分:1)

首先:感谢您提供一个小图,而不是1000行代码。

到您的积分

1。由于重构是关于改进代码结构,我不推荐这个选项。因为你在不完美的设计上构建了更多的代码,而不是改进它。

2。违反了Liskov substitution principle。我不建议你这样做。

3.1 访客模式只有在所有树元素上执行某些操作时才有意义。到目前为止,您的问题仅仅是建模树结构,因此请勿使用此模式。这是行为设计模式。您考虑结构问题,它需要结构设计模式或根本不需要模式。不要使用太多模式的反模式:)

3.2 复合模式可以满足您的需求,但您需要通过继承自第一个接口的第二个接口来扩展它。扩展模式如下所示:

extended composite pattern

编辑:与OP @ predicador37进行更长时间的对话(见评论)之后,该模式的具体实现就是结果:

concrete implementation of extended composite pattern