欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

组合模式的应用之绘制基本图形和复合图形对象

程序员文章站 2022-05-26 08:39:55
...

组合模式的使用场景

(1)通常,组合模式会组合出树型结构来,这意味着所有可以使用对象树来描述或操作的功能,都可以考虑使用组合模式,如UI界面设计中的容器对象、读取XML或对语句进行语法分析、OA系统中组织结构的处理、操作系统的资源管理器等。

(2)如果想表示对象的部分——整体层次结构,把整体和部分的操作统一起来,使得层次结构实现更简单,从外部来使用这个层次结构也容易。

(3)如果希望统一地使用组合结构中的所有对象,可以选用组合模式。

组合模式的应用之绘制基本图形和复合图形对象

//声明文件

//**************************************************************************
//结构型模式:组合模式(安全型)
//场景:绘图(基本图形和复合图形)

#include <iostream>
#include <string>
#include <list>

using namespace std;

//************************抽象组件类******************
class CGUI{
protected:
	string strName;/*名称*/
public:
	CGUI(string name);
	virtual ~CGUI();
	virtual void Draw() = 0;//绘图
};
//***********************具体组件角色*******************
//线
class CGUILine : public CGUI{
public:
	CGUILine(string name);
	~CGUILine();
	void Draw();
};

//圆
class CGUICircle : public CGUI{
public:
	CGUICircle(string name);
	~CGUICircle();
	void Draw();
};

//矩形
class CGUIRectangle : public CGUI{
public:
	CGUIRectangle(string name);
	~CGUIRectangle();
	void Draw();
};

//*****************************组合组件对象**********************
class CPicture : public CGUI{
private:
	list<CGUI*> lstGUI;
public:
	CPicture(string name);
	~CPicture();
	list<CGUI*>* GetChildren();
	bool AddChild(CGUI* gui);
	bool SubChild(CGUI* gui);
	void Draw();
};

//实现文件

//************************抽象组件类******************
CGUI::CGUI(string name) : strName(name){}
CGUI::~CGUI(){}
//***********************具体组件角色*******************
//线
CGUILine::CGUILine(string name) : CGUI(name){}
CGUILine::~CGUILine(){cout << strName << endl;}
void CGUILine::Draw(){cout << "Draw a " << strName << endl;}

//圆
CGUICircle::CGUICircle(string name) : CGUI(name){}
CGUICircle::~CGUICircle(){cout << strName << endl;}
void CGUICircle::Draw(){cout << "Draw a " << strName << endl;}

//矩形
CGUIRectangle::CGUIRectangle(string name) : CGUI(name){}
CGUIRectangle::~CGUIRectangle(){cout << strName << endl;}
void CGUIRectangle::Draw(){cout << "Draw a " << strName << endl;}

//*****************************组合组件对象**********************
CPicture::CPicture(string name) : CGUI(name){}
CPicture::~CPicture(){
	cout << strName << endl;
	for(list<CGUI*>::iterator it = lstGUI.begin(); it != lstGUI.end();){
		CGUI* pGui = (*it);delete pGui; it = lstGUI.erase(it);
	}
}
list<CGUI*>* CPicture::GetChildren(){return &lstGUI;}
bool CPicture::AddChild(CGUI* gui){lstGUI.push_back(gui); return true;}
bool CPicture::SubChild(CGUI* gui){lstGUI.remove(gui); return true;}
void CPicture::Draw()
{
	cout << "Draw Composite Object : " << strName << ">>>>>>>>>>>>>>" << endl;
	for(list<CGUI*>::iterator it = lstGUI.begin(); it != lstGUI.end(); it++){
		(*it)->Draw();
	}
	cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl;
}

//测试客户端

void main()
{
	CPicture oPicture("ShanShuiTu");
	CPicture* pShan = new CPicture("Shan");
	pShan->AddChild(new CGUIRectangle("Gao"));
	CPicture* pShui = new CPicture("Shui");
	pShui->AddChild(new CGUICircle("Yuan"));
	oPicture.AddChild(pShan);
	oPicture.AddChild(pShui);

	oPicture.Draw();
}