DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。注意两个字“树形”。这种树形结构在现实生活中随处可见,比如一个电脑中,它有文档,新的文件夹。不管是新的文件夹还是总的文件夹,在它们中基本都有文档或者新的文件夹等。对于总文件夹来说,不论是新的文件夹,还是文档都是它的一部分。整个文件夹的拓扑图就是一个树形结构。接下来我们只访问文件夹。
代码实现为:
class Floder
{
public:
Floder(string n) { name = n; }
virtual ~Floder(){}
virtual void Addfloder(Floder *p){}
virtual void Show(int depth) {}
protected:
string name;
};
class NewFloder : public Floder
{
public:
NewFloder(string n): Floder(n) {}
virtual ~NewFloder() {}
void Addfloder(Floder *p) { m_listFloder.push_back(p); } //位于树的中间,可以增加子树
void Show(int depth)
{
for(int i = 0;i < depth; i++)
cout<<"、";
cout<<m_name<<endl;
list<Floder *>::iterator iter=m_listFloder.begin();
for(; iter != m_listFloder.end(); iter++) //显示下层结点
(*iter)->Show(depth + 2);
}
private:
list<Floder *> m_listFloder ;
};
class File :public Floder
{
public:
File(string n):Floder(n){}
virtual ~File() {}
virtual void Show(int depth) //只需显示,无限添加函数,因为已是叶结点
{
for(int i = 0; i < depth; i++)
cout<<"、";
cout<<name<<endl;
}
};
组合模式主要解决在树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。
以上内容纯粹属于个人理解,如果有错误,感谢大家的指正,谢谢!