组合模式(Composite Pattern)

组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构,以表示“整体-部分”的层次结构。组合模式使得客户端可以以统一的方式处理单个对象和组合对象。

组合模式的主要思想是将对象组织成树状结构,使得单个对象和组合对象具有一致的接口。这样一来,客户端可以透明地操作单个对象或组合对象,无需关心具体是处理的是单个对象还是组合对象。

组合模式由以下几个关键角色组成:

  1. 组件(Component):定义组合对象和叶节点对象的公共接口,可以是抽象类或接口。
  2. 叶节点(Leaf):表示组合中的叶子节点,它没有子节点。
  3. 组合节点(Composite):表示组合中的复合节点,它可以包含子节点,并实现了组件的接口。
  4. 客户端(Client):通过组件接口操作组合对象。

以下是一个使用C++实现的组合模式示例,假设我们有一个组织结构,包括部门和员工的层次结构,我们希望能够透明地处理部门和员工:

#include 
#include 
#include 

// 组件接口
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()方法来显示部门和员工的信息。

组合模式可以使得对象的组织结构更加灵活,支持递归组合,以及统一处理整体和部分。它常用于树形结构的场景,例如组织机构、目录结构等。

你可能感兴趣的:(笔记,软件架构,组合模式,设计模式)