组合模式的应用之绘制基本图形和复合图形对象
程序员文章站
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();
}