c++组合模式(以访问文件夹为例子)

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;
	}
};

组合模式主要解决在树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。
以上内容纯粹属于个人理解,如果有错误,感谢大家的指正,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值