组合模式是一种结构型设计模式,它将对象组织成树形结构,使得客户端可以统一处理单个对象和对象组合。组合模式对单个对象和组合对象的操作具有一致性,使得客户端代码无需区分处理单个对象和组合对象。

组合模式包含以下主要角色:

1. 组件(Component): 声明了组合中对象的接口,可以是抽象类或接口,定义了统一的操作方法。

2. 叶子(Leaf): 表示组合中的叶子节点,实现了组件接口。

3. 复合(Composite): 表示组合中的复合节点,实现了组件接口。它包含了子组件,可以是叶子节点或其他复合节点。

4. 客户端(Client): 通过组件接口操作组合结构的对象。

下面是一个简单的组合模式的例子,假设我们要表示一个文件系统:
# 组件接口
class Component:
    def display(self):
        pass

# 叶子节点:文件
class File(Component):
    def __init__(self, name):
        self.name = name

    def display(self):
        print(f"File: {self.name}")

# 复合节点:文件夹
class Folder(Component):
    def __init__(self, name):
        self.name = name
        self.children = []

    def add_child(self, child):
        self.children.append(child)

    def remove_child(self, child):
        self.children.remove(child)

    def display(self):
        print(f"Folder: {self.name}")
        for child in self.children:
            child.display()

# 客户端代码
if __name__ == "__main__":
    # 创建文件和文件夹
    file1 = File("file1.txt")
    file2 = File("file2.txt")
    folder1 = Folder("Folder 1")
    folder2 = Folder("Folder 2")

    # 组合文件和文件夹
    folder1.add_child(file1)
    folder1.add_child(file2)
    folder2.add_child(folder1)

    # 显示文件系统结构
    folder2.display()

在上述示例中,Component 是组件接口,File 和 Folder 分别表示叶子节点和复合节点。Folder 类包含了一个子组件列表,可以是叶子节点或其他复合节点。客户端代码可以通过调用 display 方法来显示整个文件系统的结构,无论是单个文件还是文件夹。

组合模式的优点在于它使得客户端代码可以一致地处理单个对象和组合对象,而无需关心对象的具体类型。这样使得系统更加灵活,可以轻松地增加新的组件类型。组合模式常被用于处理树形结构的数据,如文件系统、图形界面的图元等。


转载请注明出处:http://www.zyzy.cn/article/detail/11846/设计模式