1.组合模式简介
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
2.源码实现
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
class ComponentPtr
{
protected:
string m_strName;
public:
ComponentPtr(string str)
{
m_strName = str;
}
virtual void add(ComponentPtr *p) = 0;
virtual void remove(ComponentPtr *p) = 0;
virtual void display() = 0;
};
class LeafPtr : public ComponentPtr
{
public:
LeafPtr(string str) : ComponentPtr(str){};
void add(ComponentPtr *p)
{
cout << "Leaf cannot add" << endl;
}
void remove(ComponentPtr *p)
{
cout << "Leaf cannot remove" << endl;
}
void display()
{
cout << m_strName << endl;
}
};
class CompositePtr : public ComponentPtr
{
private:
vector<ComponentPtr *> m_vec;
public:
CompositePtr(string str) : ComponentPtr(str){};
~CompositePtr()
{
if(!m_vec.empty())
{
m_vec.clear();
}
}
void add(ComponentPtr *p)
{
m_vec.push_back(p);
}
void remove(ComponentPtr *p)
{
vector<ComponentPtr *>::iterator it;
for(it=m_vec.begin(); it!=m_vec.end(); it++)
{
if(*it == p)
{
m_vec.erase(it);
break;
}
}
}
void display()
{
vector<ComponentPtr *>::iterator it;
for(it=m_vec.begin(); it!=m_vec.end(); it++)
{
(*it)->display();
}
}
};
int main(int argc, char **argv)
{
ComponentPtr *u[6];
u[0] = new LeafPtr("总部财务部门");
u[1] = new LeafPtr("总部人力资源部门");
u[2] = new LeafPtr("上海分部财务部门");
u[3] = new LeafPtr("上海分部人力资源部门");
u[4] = new CompositePtr("上海分部");
u[5] = new CompositePtr("总部");
CompositePtr *p = (CompositePtr *)u[5];
p->add(u[0]);
p->add(u[1]);
CompositePtr *p1 = (CompositePtr *)u[4];
p1->add(u[2]);
p1->add(u[3]);
p->add(p1);
p->display();
delete u[0];
delete u[1];
delete u[2];
delete u[3];
delete u[4];
delete u[5];
return 0;
}
3.编译源码
$ g++ -o example example.cpp
4.运行及其结果
$ ./example
总部财务部门
总部人力资源部门
上海分部财务部门
上海分部人力资源部门
网友评论