gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:03:32 24 4
gpt4 key购买 nike

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

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

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

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

  1. 因为树叶和复合接口(interface)已经不同和节点操作操作在组合中实现类,我正在考虑实现一些操作 isComposite1()isComposite2() 并使用上面的架构。
  2. 我还可以在抽象类中实现节点操作操作,并且还有属于不同叶子的那些;然后我可以如果它们不属于,则使用不执行任何操作的操作覆盖它们到那个类(class)。这样,所有的界面都是一样的类,我可以以相同的方式处理所有节点......
  3. 也许 Composite 不是这里要使用的模式?我看过一些文章建议复合+访客。对这个有用吗结构?也许架构有太多限制并且限制条件?

欢迎任何指导或建议...

提前致谢。

编辑

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

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

proposed final design diagram

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

最佳答案

首先:感谢您向我们展示了一张小图,而不是 1000 行代码。

你的观点

1. 因为重构是为了改进代码结构,所以我不推荐这个选项。由于您在不完美的设计上构建了更多代码,而不是对其进行改进。

2. 违反Liskov substitution principle .我不建议您这样做。

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

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

extended composite pattern

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

concrete implementation of extended composite pattern

关于java - 叶节点中具有自定义操作的复合模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25313738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com