组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构,以表示“整体-部分”的层次结构。组合模式使得客户端可以以统一的方式处理单个对象和组合对象。
组合模式的主要思想是将对象组织成树状结构,使得单个对象和组合对象具有一致的接口。这样一来,客户端可以透明地操作单个对象或组合对象,无需关心具体是处理的是单个对象还是组合对象。
组合模式由以下几个关键角色组成:
- 组件(Component):定义组合对象和叶节点对象的公共接口,可以是抽象类或接口。
- 叶节点(Leaf):表示组合中的叶子节点,它没有子节点。
- 组合节点(Composite):表示组合中的复合节点,它可以包含子节点,并实现了组件的接口。
- 客户端(Client):通过组件接口操作组合对象。
以下是一个使用C++实现的组合模式示例,假设我们有一个组织结构,包括部门和员工的层次结构,我们希望能够透明地处理部门和员工:
#include <iostream>
#include <string>
#include <vector>
// 组件接口
class Component {
public:
virtual void displayInfo() = 0;
};
// 叶节点
class Employee : public Component {
private:
std::string name;
public:
Employee(const std::string& name) : name(name) {}
void displayInfo() override {
std::cout << "Employee: " << name << std::endl;
}
};
// 组合节点
class Department : public Component {
private:
std::string name;
std::vector<Component*> employees;
public:
Department(const std::string& name) : name(name) {}
void addEmployee(Component* employee) {
employees.push_back(employee);
}
void displayInfo() override {
std::cout << "Department: " << name << std::endl;
for (const auto& employee : employees) {
employee->displayInfo();
}
}
};
int main() {
Component* engineering = new Department("Engineering");
Component* sales = new Department("Sales");
Component* employee1 = new Employee("John");
Component* employee2 = new Employee("Jane");
Component* employee3 = new Employee("Mike");
engineering->addEmployee(employee1);
engineering->addEmployee(employee2);
sales->addEmployee(employee3);
engineering->displayInfo();
// 输出:
// Department: Engineering
// Employee: John
// Employee: Jane
sales->displayInfo();
// 输出:
// Department: Sales
// Employee: Mike
delete engineering;
delete sales;
delete employee1;
delete employee2;
delete employee3;
return 0;
}
在上述示例中,我们有一个组织结构,包括部门(Department
)和员工(Employee
)的层次结构。部门可以包含多个员工,形成一个树状结构。
组件接口(Component
)定义了组合对象和叶节点对象的公共接口。叶节点对象是员工对象,它没有子节点。组合节点对象是部门对象,它可以包含多个子节点(即员工对象),并实现了组件接口。
通过组合模式,我们可以透明地处理部门和员工,客户端可以以统一的方式调用它们的接口。在示例中,我们创建了一个工程部门(Engineering
)和一个销售部门(Sales
),并添加了对应的员工。然后,我们调用部门的displayInfo()
方法来显示部门和员工的信息。
组合模式可以使得对象的组织结构更加灵活,支持递归组合,以及统一处理整体和部分。它常用于树形结构的场景,例如组织机构、目录结构等。