组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。结构图如下:
代码:
#pragma once
#include <string>
class Component {
public:
virtual void Add(Component* pCom) = 0;
virtual void Remove(Component* pCom) = 0;
virtual void Display(int depth) = 0;
};
#pragma once
#include <iostream>
#include <string>
#include "Component.h"
class Leaf : public Component {
public:
Leaf(std::string name) : m_leafName(name) {}
void Add(Component* pCom) {
std::cout << "叶子节点不允许添加节点" << std::endl;
}
void Remove(Component* pCom) {
std::cout << "叶子节点不允许删除节点" << std::endl;
}
void Display(int depth) {
std::cout << std::string("-", depth) + m_leafName << std::endl;
}
private:
std::string m_leafName;
};
#pragma once
#include <iostream>
#include <string>
#include <list>
#include "Component.h"
class Composite : public Component {
public:
Composite(std::string name) : m_compositeName(name) {
m_lstComposite.clear();
}
void Add(Component *pCom) {
m_lstComposite.emplace_back(pCom);
}
void Remove(Component * pCom) {
m_lstComposite.remove(pCom);
}
void Display(int depth) {
std::cout << std::string("-", depth) + m_compositeName << std::endl;
for (auto item : m_lstComposite) {
item->Display(depth + 1);
}
}
private:
std::string m_compositeName;
std::list<Component*> m_lstComposite;
};
#include "Composite.h"
#include "Leaf.h"
void main() {
Composite *root = new Composite("root");
root->Add(new Leaf("Leaf A"));
root->Add(new Leaf("Leaf B"));
Composite *comp = new Composite("Composite X");
comp->Add(new Leaf("Leaf XA"));
comp->Add(new Leaf("Leaf XB"));
root->Add(comp);
Composite* comp2 = new Composite("Composite XY");
comp2->Add(new Leaf("Leaf XYA"));
comp2->Add(new Leaf("Leaf XYB"));
comp->Add(comp2);
root->Add(new Leaf("Leaf C"));
Leaf* leaf = new Leaf("Leaf D");
root->Add(leaf);
root->Remove(leaf);
root->Display(0);
}
客户可以透明一致的使用实体类型,省去不必要的逻辑判断。常见使用场景如:web定制控件、OA系统等。