设计模式之组合模式

        组合模式是一种对象结构型模式,一般用于树型结构中,其本质是定义一个抽象组件类,该组件既可以代表叶子对象也可以代表容器对象(容器可以包含叶子和容器),使用时无需知道操作对象是叶子还是容器,实现对容器和叶子的无差别化操作。对子容器的节点操作时,本质上使用了递归遍历。

如下图的树型结构,



组合模式:

以下代码在VS2012上编译通过

.h文件

class Conponent//抽象组件类
{
public :
	virtual void addchildren(Conponent* child_);//添加子节点
	virtual void removechildren(Conponent* child_);//删除子节点
	virtual Conponent* getchildren(int num_);//获取某个子节点
	virtual void method();//调用组件方法
};

class leafConponent: public Conponent//末节点类
{
	
public :
	
	void addchildren(Conponent* child_);
	void removechildren(Conponent* child_);
	Conponent* getchildren(int num_);
	void method();
};


class contentConponent:public Conponent//容器类
{
	list<Conponent*> mConp;
public:
	
	void addchildren(Conponent* child_);
	void removechildren(Conponent* child_);
	Conponent* getchildren(int num_);
	void method();

};

.cpp文件

void Conponent::addchildren(Conponent* child_)
{
	
}
void Conponent::removechildren(Conponent* child_)
{
	
}
Conponent* Conponent::getchildren(int num_)
{	
	return NULL ;
}
void Conponent::method()
{
	
}
void leafConponent::addchildren(Conponent* child_)
{
	cout<<"I can not add child"<<endl;
}
void leafConponent::removechildren(Conponent* child_)
{
	cout<<"I can not remove child"<<endl;
}
Conponent* leafConponent::getchildren(int num_)
{
	cout<<"I can not get child"<<endl;
	return NULL ;
}
void leafConponent::method()
{
	cout<<"call leafConponent method"<<endl;
}

void contentConponent::addchildren(Conponent* child_)
{
	mConp.push_back(child_);
	cout<<"call contentConponent add child"<<endl;
}
void contentConponent::removechildren(Conponent* child_)
{
	mConp.pop_back();
	cout<<"call contentConponent remove child"<<endl;
}
Conponent* contentConponent::getchildren(int num_)//获取该容器下第num_个组件
{
	cout<<"call contentConponent get child"<<endl;
	list<Conponent*>::iterator mlist=mConp.begin();
	advance(mlist,num_);
	return *mlist;
}
void contentConponent::method()//递归遍历该容器下所有组件的方法
{
	cout<<"call contentConponent method"<<endl;
	list<Conponent*>::iterator i;
	for(i=mConp.begin();i!=mConp.end();i++)
	{
		(*i)->method();
	}
}

调用代码:

int _tmain(int argc, _TCHAR* argv[])
{
	Conponent* leaf1=new leafConponent();//创建叶子节点1
	Conponent* leaf2=new leafConponent();//创建叶子节点2
	Conponent* leaf3=new leafConponent();//创建叶子节点3
	Conponent* cont1=new contentConponent();//创建容器1
	Conponent* cont2=new contentConponent();//创建容器2
	cont1->addchildren(leaf1);//在容器1中添加叶子节点1
	cont1->addchildren(leaf2);//在容器1中添加叶子节点2
	cont2->addchildren(leaf3);//在容器2中添加叶子节点3
	cont2->addchildren(cont1);//在容器2中添加容器1
	cont2->method();//执行容器2中各节点的方法
	return 0;
}

执行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值