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

Java 叶节点中具有自定义操作的复合模式,java,design-patterns,composite,Java,Design Patterns,Composite,我正在尝试使用复合模式重构树状结构。但是,它似乎并不完全符合模式要求: 可以使用不同类型的叶节点:它们的属性和操作(方法)不同 可以使用不同类型的复合对象:它们的属性和操作不同,并且有一些约束(例如:Composite1对象不能是Composite2子对象;Composite2对象可以是Composite1子对象) 情况如下图所示: 所以,我想知道哪一个是最好的解决方案: 因为树叶和复合材料的界面已经不同了 并在组合中实现节点操作操作 类,我正在考虑实现一些操作isComposite1()

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

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

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

  • 因为树叶和复合材料的界面已经不同了 并在组合中实现节点操作操作 类,我正在考虑实现一些操作isComposite1() 和isComposite2()并使用上面的模式
  • 我还可以在抽象类和 还有属于不同叶子的那些;那我就可以 使用不属于它们的操作重写它们 去那个班。这样,接口对于所有的应用程序都是相同的 类和我可以以相同的方式处理所有节点
  • 也许复合模式不是这里要使用的模式?我读过一些文章 建议复合+访客。这样做有用吗 结构?可能模式有太多的限制和限制 约束条件
  • 欢迎您提供任何指导或建议

    提前谢谢

    编辑

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

    一个节点接口,用于为不同类型的节点(be-leaf、be-composite)组成结构和特定接口。此外,在需要时使用抽象类提供默认实现。下图是最终情况的示意图:


    非常感谢@Waog提供您的想法和解释。我希望我有这个想法

    首先:感谢您为我们展示了一个小图表,而不是1000行代码

    说到你的观点 1.因为重构是为了改进代码结构,所以我不推荐这种选项。因为你在一个不完美的设计上构建了更多的代码,而不是改进它

    2.违反了。我不建议你这样做

    3.1只有当您希望在所有树元素上执行某些操作时,访问者模式才有意义。到目前为止,您的问题只是关于树结构的建模,所以不要使用此模式。这是一种行为设计模式。您考虑一个需要结构设计模式或根本不需要模式的结构问题。不要使用太多模式的反模式:)

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

    编辑:在与OP@predicador37进行了较长的对话(见注释)后,该模式的具体实现是以下结果:


    但是,如果我使用接口而不是抽象类,那么继承的属性呢?我应该使用两个从另一个继承的抽象类吗?那么Leaf1类的属性和操作与Leaf2类的属性和操作有什么不同呢?@predicador37问一个问题:因为我们在这里做设计(应该独立于编程语言,使用通用的OO模式),接口可能包含这个级别的属性。若您认为这种语言不支持接口中的属性,那个么您需要一种解决方法。要么在接口中定义getter和setter,要么使用抽象类而不是接口。我不确定属性的确切语义,但它们在我看来像是实现细节,不应该是接口的一部分。@predicador37问题二和问题三:教科书中的示例将有一个:接口链,但实际上这通常被认为是过度工程。然后你可以使用一些不太“理想”的结构,让你的东西运转起来。那是品味的问题。如果你没有经验来决定这个问题,我建议你首先设计教科书的例子,然后减少部分内容。你可以做一些快速的UML草图,而不是实现它来决定;当然可以,为了不迷路,我把他们都包括进去了。我很晚才读到你的评论,因为我已经上传了最后一张图表。。。