提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
软件在某些情况下客户代码过多依赖对象容器复杂的内部实现结构,对象容器内部实现结构的变化将引起客户代码的频繁变化。需要将客户代码和复杂的对象容器结构解耦,让对象容器自己来实现自身复杂的结构。
提示:以下是本篇文章正文内容,下面案例可供参考
一、模式定义
将对象组合成树形结构以表示部分-整体的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)。
二、代码实例
cpp
#include <algorithm>
using namespace std;
class Component
{
public:
virtual void process() = 0;
virtual ~Component() {}
};
// 树节点
class Composite: public Component
{
string name;
list<Component*> elements;
public:
Composite(const string& s): name(s) {}
void add(Component* c) { elements.push_back(c); }
void remove(Component* c) { elements.remove(c); }
void process()
{
// process current node
// process leaf nodes
for(auto& e: elements)
{
e->process();
}
}
}
// 叶子节点
class Leaf: public Component
{
string name;
public:
Leaf(const string& s): name(s) {}
void process() { /* ... */ }
}
// 客户程序
void Invoke(Component* c)
{
/*前处理*/
c->process();
/*后处理*/
}
int main()
{
Composite root("root");
Composite treeNode1("treeNode1");
Composite treeNode2("treeNode2");
Component treeNode3("treeNode3");
Component treeNode4("treeNode4");
Leaf leaf1("leaf1");
Leaf leaf2("leaf2");
root.add(&treeNode1);
treeNode1.add(&treeNode2);
treeNode2.add(&leaf1);
root.add(&treeNode3);
treeNode3.add(&treeNode4);
treeNode4.add(&leaf2);
root.process();
}