C++组合模式

意图

将对象组合成树形结构以表示"部分-整体"的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性。

适用性

  • 你想表示对象的"部分-整体"层次结构
  • 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象

模式结构

  1. 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。
  2. 树枝构件(Composite)角色/中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含Add()Remove()GetChild() 等方法
  3. 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件

示意性代码

// 抽象构件:计数
class Counter {
public:
    virtual ~Counter() { }
    virtual int count() = 0;
};

// 树叶构件
class City : public Counter {
public:
    City(int sum) {
        this->sum = sum;
    }

    int count() override {
        return sum;
    }

private:
    int sum = 0;
};

// 树枝构件
class Composite : public Counter {
public:
    ~Composite() {
        for (auto& counter : counters) {
            delete counter;
        }
    }

    void add(Counter* counter) {
        counters.push_back(counter);
    }

    void del(Counter* counter) {
        auto it = find(counters.begin(), counters.end(), counter);
        counters.erase(it);
    }   

    int count() {
        int sum = 0;
        for (const auto& counter : counters) {
            sum += counter->count();
        }

        return sum;
    }

private:
    vector<Counter*> counters;
};

// 使用:统计人口数量
int main() {
    Composite* china = new Composite();
    City* beijing = new City(100000); // 直辖市
    City* shanghai = new City(50000); // 直辖市

    china->add(beijing);
    china->add(shanghai);

    Composite* shanxi = new Composite();
    shanxi->add(new City(3000)); // 大同市
    shanxi->add(new City(2000)); // 太原市

    china->add(shanxi);

    cout << china->count() << endl;
}

参考

  1. 组合模式(详解版)
  2. 五分钟学设计模式.20.组合模式
posted @ 2022-07-29 16:06  岁月飞扬  阅读(84)  评论(0编辑  收藏  举报