我正在尝试使用复合模式重构树状结构。但是,它似乎并不完全符合模式要求:
- 可能有不同类型的叶节点:它们的属性和操作(方法)不同
- 可能有不同类型的复合对象:它们在属性和操作上有所不同,并且有一些限制(例如:Composite1 对象不能是 Composite2 的子对象;Composite2 对象可以是 Composite1 的子对象)
情况如下图所示:
所以,我想知道哪个是最好的解决方案:
- 因为树叶和复合接口(interface)已经不同 和节点操作操作在组合中实现 类,我正在考虑实现一些操作 isComposite1() 和 isComposite2() 并使用上面的架构。
- 我还可以在抽象类中实现节点操作操作,并且 还有属于不同叶子的那些;然后我可以 如果它们不属于,则使用不执行任何操作的操作覆盖它们 到那个类(class)。这样,所有的界面都是一样的 类,我可以以相同的方式处理所有节点......
- 也许 Composite 不是这里要使用的模式?我看过一些文章 建议复合+访客。对这个有用吗 结构?也许架构有太多限制并且 限制条件?
欢迎任何指导或建议...
提前致谢。
编辑
在仔细考虑@Waog 的回复、阅读更多关于该主题的引用资料并再次考虑我的问题之后,我认为合理的解决方案可能如下所示:
一个 Node 接口(interface),用于为不同类型的节点(叶节点、复合节点)组合结构和特定接口(interface)。此外,在需要时使用抽象类提供默认实现。下面是最终情况的图表:
非常感谢@Waog 的想法和解释。我希望我有想法...
最佳答案
首先:感谢您向我们展示了一张小图,而不是 1000 行代码。
你的观点
1. 因为重构是为了改进代码结构,所以我不推荐这个选项。由于您在不完美的设计上构建了更多代码,而不是对其进行改进。
2. 违反Liskov substitution principle .我不建议您这样做。
3.1 访问者模式 仅当您想对所有树元素执行某些操作时才有意义。到目前为止,你的问题只是关于树结构建模,所以不要使用这种模式。这是一种行为设计模式。您考虑一个结构性问题,它需要一个结构设计模式或者根本不需要任何模式。不要做使用太多模式的反模式:)
3.2 复合模式 可以满足您的需求,但您需要通过继承自第一个接口(interface)的第二个接口(interface)来扩展它。扩展模式如下所示:
编辑:在与 OP @predicador37 进行更长时间的对话后(参见评论),该模式的具体实现是结果:
关于java - 叶节点中具有自定义操作的复合模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25313738/