组合模式将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
下面是组合模式的UML图:
代码如下:
class Company
{
protected:
std::string m_strName;
public:
Company(const std::string& __n)
{
m_strName = __n;
}
~Company() {}
virtual void Add(Company* __c) {}
virtual void Remove(Company* __c) {}
virtual void Display(int depth) {}
virtual void LineOfDuty() {}
};
class ConcreteCompany : public Company
{
private:
std::list<Company*> __clist;
public:
ConcreteCompany( const std::string& __n): Company( __n){ }
~ConcreteCompany()
{
for each (Company* var in __clist)
{
delete var;
var = NULL;
}
}
virtual void Add(Company* __c)
{
__clist.push_back(__c);
}
virtual void Remove(Company* __c)
{
__clist.remove(__c);
}
virtual void Display(int depth)
{
std::cout << std::string(depth, '-') << m_strName<<"\n";
for each (Company* var in __clist)
{
var->Display(depth + 2);
}
}
virtual void LineOfDuty()
{
for each (Company* var in __clist)
{
var->LineOfDuty();
}
}
};
class FinanceDepartment : public Company
{
public:
FinanceDepartment(const std::string& __n) : Company(__n) {}
~FinanceDepartment() {}
virtual void Add(Company* __c) {}
virtual void Remove(Company* __c) {}
virtual void Display(int depth)
{
std::cout << std::string(depth, '-') << m_strName << "\n";
}
virtual void LineOfDuty()
{
std::cout << m_strName << "公司财务收支管理" << "\n";
}
};
//客户端代码
int _tmain(int argc, TCHAR* argv[])
{
ConcreteCompany * root = new ConcreteCompany("北京总公司");
root->Add( new HRDepartment("总公司人力资源部") );
root->Add(new FinanceDepartment("总公司财务部"));
ConcreteCompany * comp = new ConcreteCompany("上海华东分公司");
comp->Add(new HRDepartment("华东分公司人力资源部"));
comp->Add(new FinanceDepartment("华东分公司财务部"));
root->Add(comp);
ConcreteCompany * comp1 = new ConcreteCompany("南京办事处");
comp1->Add(new HRDepartment("南京办事处人力资源部"));
comp1->Add(new FinanceDepartment("南京办事处财务部"));
comp->Add(comp1);
ConcreteCompany * comp2 = new ConcreteCompany("杭州办事处");
comp2->Add(new HRDepartment("杭州办事处人力资源部"));
comp2->Add(new FinanceDepartment("杭州办事处财务部"));
comp->Add(comp2);
std::cout << "结构图" << "\n";
root->Display(1);
std::cout << "职责" << "\n";
root->LineOfDuty();
if (root)
{
delete root;
root = NULL;
}
return 0;
}
运行结果: