Composite(组合)模式

一、组合模式简介(Brief Introduction)

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

二、解决的问题(What To Solve)

解决整合与部分可以被一致对待问题。

三、代码解释

Component:抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现
Leaf:叶子节点对象,定义和实现叶子对象的行为,不再包含其他的子节点对象
Composite:组合对象,通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义的与子组件有关的操作
Client:客户端,通过组件接口来操作组合结构里面的组件对象

四、源代码

1、Component代码

 

/**
**Component:叶子节点和组合节点所用到得接口都在此处定义,为了
**不要区分叶子节点和组合节点(透明性)
**/
class Picture;
class Graphic
{
public:
	virtual void draw(){}
	virtual void add(Graphic *graphic){}
	virtual Picture* getPicture(){return 0;}
};


2、Leaf代码

/**
**Leaf:叶子节点,没有子节点
**/
class Line:public Graphic
{
public:
	virtual void draw()
	{
		std::cout << "draw a line" << endl;
	}
};


 

/**
**Leaf:叶子节点,没有子节点
**/
class Text:public Graphic
{
public:
	virtual void draw()
	{
		std::cout << "draw text" << std::endl;
	}
};


3、Composite代码

/**
**Composite:组合节点,存储子部件;子部件可以是叶子节点,也可以本身就是一个组合节点;
**/
class Picture:public Graphic
{
public:
	virtual void draw()
	{
		for(list<Graphic*>::iterator iter = _list.begin();iter != _list.end(); iter++)
		{
			(*iter)->draw();
		}
	}

	virtual void add(Graphic *graphic)
	{
		_list.push_back(graphic);
	}
	virtual Picture* getPicture()
	{
		return this;
	}

	virtual ~Picture()
	{
		for(list<Graphic*>::iterator iter = _list.begin();iter != _list.end(); iter++)
		{
			delete (*iter);
		}
	}
private:
	list<Graphic*> _list;
};


4、Client代码

Graphic *text = new Text();
	Graphic *line = new Line();
	Graphic *p = new Picture();
	//查看p是否是一个组合,Text,line这种类型的叶子节点没有add操作
	//我们是在组合里面,销毁内存的;所以,如果对这些叶子节点执行add操作,会造成内存泄露
	if (p->getPicture() != 0)
	{
		p->add(text);
	    p->add(line);
	}
	
	p->draw();

	delete p;



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值