C++组合模式
意图
将对象组合成树形结构以表示"部分-整体"的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性。
适用性
- 你想表示对象的"部分-整体"层次结构
- 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象
模式结构
- 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。
- 树枝构件(Composite)角色/中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含
Add()
、Remove()
、GetChild()
等方法 - 树叶构件(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;
}