组合模式包含以下几个主要角色:
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/设计模式