c++组合模式和原型模式一起使用

本文通过C++代码示例详细介绍了组合模式的基本概念及其应用场景。通过定义Component基类和Composite及Leaf派生类,实现了树形结构的组件管理和操作。示例展示了如何通过组合模式灵活地增加和删除组件,并保持一致的操作接口。

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

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

class Component
{
public:
	virtual Component* clone() = 0;
	virtual void operation() = 0;
	virtual void Add(Component* pComponent) {}
	virtual void Remove(Component* pComponent) {}
	virtual Component* Getchild(int index) const {return 0;}
	virtual ~Component() {}
};

class Composite:public Component
{
public:
	Composite() {m_vector.clear();}
	Composite(const Composite& rhs);
	Component* clone();
	void Add(Component* pComponent);
	void Remove(Component* pComponent);
	Component* Getchild(int index) const;
	void operation();
	vector<Component*> GetData() const;
private:
	vector<Component* > m_vector;

};

Component* Composite::clone()
{
	return new Composite(*this);
}

Composite::Composite(const Composite& rhs)
{
	int nSize = rhs.GetData().size();
	m_vector.resize(nSize);
	//m_vector = rhs.GetData();
	//int a = 5;
	vector<Component*> vt = rhs.GetData();
	memcpy(&m_vector[0], &vt[0], nSize*sizeof(Component*));
}

vector<Component*> Composite::GetData() const
{
	return m_vector;
}

void Composite::Add(Component* pComponent)
{
	m_vector.push_back(pComponent);
}

void Composite::Remove(Component* pComponent)
{
	vector<Component* >::iterator it = m_vector.begin();
	while(it != m_vector.end())
	{
		if(*it == pComponent)
		{
			it = m_vector.erase(it);
		}
		else
		{
			++it;
		}
	}
}

Component* Composite::Getchild(int index) const
{
	if(index >0 && index <= (int)m_vector.size())
	{
		return m_vector[index];
	}
}

void Composite::operation()
{
	cout<<"this is the composite"<<endl;
	vector<Component*>::iterator it = m_vector.begin();
	while (it != m_vector.end())
	{
		(*it)->operation();
		++it;
	}
}

class Leaf:public Component
{
public:
	Leaf() {}
	Leaf(const Leaf& rhs) {}
	Component* clone() {return new Leaf(*this);}
	void operation() {cout<<"this is the leaf"<<endl;}
};

int _tmain(int argc, _TCHAR* argv[])
{
	Component* pRoot = new Composite();
	Leaf* pLeafA = new Leaf();
	Leaf* pLeafB = new Leaf();
	pRoot->Add(pLeafA);
	pRoot->Add(pLeafB);

	cout<<"before the delete:"<<endl;
	pRoot->operation();

	Component* pRootOld = pRoot->clone();
	pRoot->Remove(pLeafA);
	cout<<endl<<"after remove a leaf:"<<endl;
	pRoot->operation();

	cout<<endl<<"the state before delete:"<<endl;
	pRootOld->operation();
	
	getchar();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值