设计模式C++版:第九式组合模式

本文介绍了一种常用的设计模式——组合模式,通过将对象组织为树形结构来表达整体与部分的关系,使得用户能一致地处理单个对象和组合对象。文中提供了一个具体的实现案例,展示了如何创建基本对象和组合对象,并通过递归方式展示这些对象的结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组合模式:将对象组合成树形结构以表示部分和整体的关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。优点:基本对象可以组合成更复杂的对象。任何用到基本对象的地方,都可以使用组合对象。示例代码:

#include <string>
using std::string;
#include <list>
using std::list;

class CTest
{
public:
	CTest(string name) :m_name(name){	}
	virtual ~CTest(){ }
	virtual void add(CTest* CTest){	}
	virtual void remove(CTest* CTest){	}
	virtual void display(int depth){	}
	virtual void lineofduty(){	}
protected:
	string m_name;
private:

};


class ConcreteTest :public CTest
{
public:
	ConcreteTest(string name) :CTest(name){	}

	~ConcreteTest()
	{
		while (true){
			if (!m_childrenList.empty()){
				delete *m_childrenList.begin();
			}
			else{
				break;
			}
		}

	}

	void add(CTest* CTest)override
	{
		m_childrenList.push_back(CTest);
	}

	void remove(CTest* CTest)override
	{
		m_childrenList.remove(CTest);
	}

	void display(int depth)override
	{
		printf("%d,%s\n", depth, m_name.c_str());
		for each  (CTest* var in m_childrenList){
			var->display(depth + 2);
		}
	}

	void lineofduty()override
	{
		for each  (CTest* var in m_childrenList){
			var->lineofduty();
		}
	}

private:
	list<CTest*>m_childrenList;
};


class LeafTest :public CTest
{
public:
	LeafTest(string name) :CTest(name){	}

	void add(CTest* CTest)override{	}

	void remove(CTest* CTest){	}

	void display(int depth)override
	{
		printf("%d,%s\n", depth, m_name.c_str());
	}

	void lineofduty()
	{
		printf("组合树的叶子\n");
	}

};

int main()
{
	ConcreteTest *root = new ConcreteTest("跟节点");

	root->add(new LeafTest("叶子一"));

	ConcreteTest* test1 = new ConcreteTest("子节点一");
	test1->add(new LeafTest("子叶子一"));
	root->add(test1);

	ConcreteTest* test2 = new ConcreteTest("孙节点一");
	test2->add(new LeafTest("孙叶子一"));
	test1->add(test2);

	printf("树的结构是-----------------\n");
	root->display(1);

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值