【问题标题】:Composite pattern with custom operations in leaf nodes叶节点中具有自定义操作的复合模式
【发布时间】:2014-10-08 10:34:32
【问题描述】:

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

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

情况如下图所示:

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

  1. 由于叶子和复合接口已经不同 和节点操作操作在复合中实现 类,我正在考虑实现一些操作 isComposite1()isComposite2() 并使用上面的模式。
  2. 我还可以在抽象类中实现节点操作操作和 也属于不同叶子的;那么我可以 如果它们不属于,则使用不执行任何操作的操作来覆盖它们 到那个班级。这样,所有的接口都是一样的 类,我可以以同样的方式对待所有节点......
  3. 也许 Composite 不是在这里使用的模式?我读过一些文章 建议复合+访客。对这个有用吗 结构体?也许架构有太多的限制和 约束?

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

提前致谢。

编辑

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

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

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

【问题讨论】:

    标签: java design-patterns composite


    【解决方案1】:

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

    给你的观点

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

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

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

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

    编辑:在与 OP @predicador37(请参阅 cmets)进行较长时间的对话后,该模式的具体实现是结果:

    【讨论】:

    • 但是,如果我使用接口而不是抽象类,那么继承的属性呢?我应该使用两个抽象类从另一个继承一个吗?那么Leaf1类与Leaf2类不同的属性和操作呢?
    • @predicador37 问题一:因为我们在这里进行设计(应该独立于编程语言并使用通用的 OO paragigms)接口可能包含此级别的属性。如果您的语言不支持接口中的属性,那么您需要解决方法。要么在接口中定义 getter 和 setter,要么使用抽象类而不是接口。我不确定您的属性的确切语义,但对我来说它们看起来像是实现细节,不应该是接口的一部分。
    • @predicador37 问题二和三:教科书示例将具有以下链:interface 。并使所有功能尽可能接近 abstractClass1,以防止代码重复。因此,您的通用代码库处于每个孩子都可以使用的水平。唯一代码处于只有一个班级可以使用它的级别。
    • 但实际上这通常被认为是过度工程。然后你可以使用一些不太“理想”的结构来让你的东西正常工作。那是口味问题。如果您没有经验来决定这一点,我建议您先设计教科书示例,然后减少其中的一些部分。你可以做一些快速的 UML 草图,而不是实现它来决定。
    • 感谢您的建议;绝对可以,我把它们都包括在内是为了不迷路。因为我已经上传了最后一张图表,所以我已经很晚才看到你的评论......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2017-05-08
    • 2020-06-10
    相关资源
    最近更新 更多