c++组合模式

组合模式

1、组合模式简介

  组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户可以一致的方式处理单个对象或对象的组合。组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,
可以对其进行统一处理。

2、组合模式应用场景

当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了。

基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。

用户不用关心到底是处理一个叶节点还是处理一个组合组件,也就用不着为定义组合二写一些选择判断语句了。

组合模式让客户可以一致地使用组合结构和单个对象。

3、组合模式举例

  以window下的文件系统举例,文件夹下面可以有文件,也可以有文件夹,此时便是典型的组合模式应用场景。引入组合模式后对于用户来说无需关注到底是文件还是文件夹,都可以按照文件夹来进行增删的操作,不过叶子节点(文件)不去实现而已。
现有如下文件系统

在这里插入图片描述

class Component
{
protected:
	std::string m_strName;
public:
	Component(std::string str)
	{
		m_strName = str;
	}
	virtual void add(Component * p) = 0;
	virtual void remove(Component * p) = 0;
	virtual void Show() = 0;
};

class File : public Component
{
public:
	File(std::string str) : Component(str) {}
	void add(Component * p)
	{
		std::cout << "file cannot add file" << std::endl;
	}
	void remove(Component * p)
	{
		std::cout << "file cannot remove file" << std::endl;
	}
	void Show()
	{
		std::cout << m_strName << std::endl;
	}
};

class Folder : public Component
{

public:
	Folder(std::string str) : Component(str) {};
	~Folder()
	{
	}
	void add(Component * p)
	{
		std::cout << "folder add file" << std::endl;
	}
	void remove(Component * p)
	{
		std::cout << "folder remove file" << std::endl;
	}
	void Show()
	{
		std::cout << "folder show all file" << std::endl;
	}
};


int main()
{
	Component * p = new Component("总文件夹");
	p->add(new File("1.txt"));
	p->add(new File("2.txt"));
	
	Component * p1 = new Component("子文件夹1");
	p1->add(new File("3.txt"));
	p1->add(new File("4.txt"));
	
	p->add(p1);
	p->Show();
	getchar()
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值