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

标签 java design-patterns composite

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

  • 可能有不同类型的叶节点:它们的属性和操作(方法)不同
  • 可能有不同类型的复合对象:它们在属性和操作上有所不同,并且有一些限制(例如: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/

相关文章:

ios - 如何在手机中强制执行唯一的用户名

java - 复合模式的定义

c - 在 gtk+ 复合小部件中的 typedef 结构 ** 上使用 g_value_get_pointer

java - 无法使用sqoop将mysql表导入到hadoop

java - Jersey 隐藏了 Spring 框架和 SockJS

java - oracle.jbo.RowNotFoundException : JBO-25020:View row of key oracle. jbo.Key[35761] 在迭代器中找不到

image-processing - ImageMagick:使用 convert -composite 与重心分层图像

java - 将 Bootstrap css 文件包含到 spring 元素 jsp 文件中

design-patterns - symfony2中使用的设计模式

design-patterns - 合并数据的数据库架构设计模式