组合模式是一种结构型设计模式,它允许将对象组合成树状结构来表示“部分-整体”的层次关系。组合模式使得客户端可以统一处理单个对象和对象组合,无需区分它们的具体类型。

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

1. 组件(Component): 定义了组合中所有对象的通用接口,包括叶子节点和容器节点。
2. 叶子节点(Leaf): 是组合中的叶子对象,它不包含其他对象。
3. 容器节点(Composite): 是包含其他组件的对象,可以包括叶子节点和其他容器节点。

以下是一个简单的 Python 示例,演示了组合模式用于表示和操作文件系统的应用:
from abc import ABC, abstractmethod

# 组件接口
class Component(ABC):
    @abstractmethod
    def operation(self):
        pass

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

    def operation(self):
        return f"File: {self.name}"

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

    def add(self, component):
        self.children.append(component)

    def remove(self, component):
        self.children.remove(component)

    def operation(self):
        result = f"Folder: {self.name}\n"
        for child in self.children:
            result += f"  {child.operation()}\n"
        return result

# 客户端
file1 = File("File 1")
file2 = File("File 2")
file3 = File("File 3")

folder1 = Folder("Folder 1")
folder1.add(file1)
folder1.add(file2)

folder2 = Folder("Folder 2")
folder2.add(file3)

root = Folder("Root")
root.add(folder1)
root.add(folder2)

# 客户端可以统一处理单个对象和对象组合
print(root.operation())

在这个示例中,Component 是组件接口,File 是叶子节点,表示文件;Folder 是容器节点,表示文件夹。容器节点可以包含叶子节点和其他容器节点。

客户端可以通过统一的接口来操作文件和文件夹,无需关心它们的具体类型。组合模式使得树状结构的操作变得一致和简化。

组合模式适用于那些希望客户端一致地对待单个对象和对象组合的情境,例如文件系统、图形界面中的控件组织等。


转载请注明出处:http://www.pingtaimeng.com/article/detail/13945/设计模式