【问题标题】:Composite Design Pattern Leaf Management复合设计模式叶管理
【发布时间】:2015-07-28 04:28:13
【问题描述】:

我见过的大多数复合设计模式的描述都有 Composite 实现 add()remove() 方法,而在 Leaf 对象中未实现这些方法。例如,该主题的Wiki Page 中的图表暗示了这一点,这与GoF图表或多或少相同。

关于在父 Component 类中实现这些,GoF 有以下说法:

在类层次结构的根部定义子管理接口为您提供了透明度,因为您可以统一对待所有组件。但是,这会损害您的安全,因为客户端可能会尝试做一些无意义的事情,例如从叶子中添加和删除对象。

我同意拥有Leaf 实现remove() 处理起来很奇怪。 (你删除自己吗?你必须实现某种NullLeaf 对象吗?)但是由于模式的重点是使Leafs 和Composites 的行为方式相同,我不明白为什么@ 987654332@可以在Component中实现。

我的问题:为什么Component至少不能实现add()?这样做会违反任何关键设计原则吗?这样做是否不再使这成为一种复合设计模式?下面是一个 Python 示例,它抓住了我试图在自己的工作中实现的精髓:

class Component:
    def add(self, other):
        # in Python, may be more natural to define __add__
        c = Composite()
        c.children = self.children + other.children
        return c

class Leaf(Component):
    def __init__(self):
        self.children = [self]  # possibly strange?

    def operation(self):
        # operation specific to this leaf

class Composite(Component):
    def __init__(self):
        self.children = []

    def operation(self):
        for child in self.children:
            child.operation()

带有“示例用法”:

>>> l1 = Leaf()
>>> l2 = Leaf()
>>> c = l1.add(l2)  # c is a `Composite` instance
>>> c.operation()

【问题讨论】:

    标签: oop design-patterns


    【解决方案1】:

    为什么 Component 至少不能实现 add()?这样做会违反 任何关键的设计原则?这样做是否不再使这成为 复合设计模式?

    你自己回答了这个问题,就像你写的那样

    在类的根目录下定义子管理接口 层次结构为您提供透明度,因为您可以处理所有组件 均匀地。但是,这会损害您的安全,因为客户可能会尝试这样做 无意义的事情,比如从叶子中添加和删除对象。

    将子管理方法添加到接口是一种权衡。当您这样做时,您将获得统一处理层次结构中所有对象的好处。但是对于叶子,您必须决定一种策略来处理没有意义的界面。可以做的是为方法创建空实现或在调用它们时抛出异常。另一种方法是创建一个抽象基类Component,它定义了add()remove() 方法,然后在Composite 中使用该实现并用一个空实现覆盖Leaf 中的方法例如。所有这些实现都是Composite 模式变体。恕我直言,这些模式不应逐字阅读,而应作为指导原则,让您自己定制实施。

    【讨论】:

    • 感谢您的回复!您是否遇到过实施这种变体的示例?我见过很多LeafComponent 提供add()remove() 的空实现,但没有使用不同行为的实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    相关资源
    最近更新 更多