您的位置:首页 > 产品设计 > UI/UE

23种设计模式(4)--builder模式

2016-05-17 15:02 465 查看
builder模式中的关键为director和builder,其中director为一个对象的的多个组成部分提供接口,而builder为组成对象一个个部分的实现细节。结构如下:



以下代码中,每一种builder代表一种产品,当然在Director中,可以使用不同的组合方式实现不同结构的组合。在代码重构时,添加新产品时只需要添加一种builder即可,满足扩展开放,修改封闭的原则。

代码实现

1 Product

/************************************************************************
* Product Controls                                                     *
***********************************************************************/

/***********************************************
* Class Frame                                 *
**********************************************/
class Frame
{
public:
virtual void draw() = 0;
};

/***********************************************
* Class Title                                 *
**********************************************/
class Title : public Frame
{
public:
virtual void draw()
{
cout<<"title draw"<<endl;
}
};

class TextTitle: public Title
{
public:
virtual void draw()
{
cout<<"TextTitle draw"<<endl;
}
};

class ImageTitle: public Title
{
public:
virtual void draw()
{
cout<<"ImageTitle draw"<<endl;
}
};

/***********************************************
* Class Menu                                  *
**********************************************/
class Menu : public Frame
{
public:
virtual void draw()
{
cout<<"menu draw"<<endl;
}
};

class ListMenu: public Menu
{
public:
virtual void draw()
{
cout<<"ListMenu draw"<<endl;
}
};

class ThreeDMenu: public Menu
{
public:
virtual void draw()
{
cout<<"3DMenu draw"<<endl;
}
};

/***********************************************
* Class Toolbar                               *
**********************************************/
class Toolbar : public Frame
{
public:
virtual void draw()
{
cout<<"Toolbar draw"<<endl;
}
};

class CellToolbar : public Toolbar
{
public:
virtual void draw()
{
cout<<"CellToolbar draw"<<endl;
}
};

class FloatToolbar : public Toolbar
{
public:
virtual void draw()
{
cout<<"FloatToolbar draw"<<endl;
}
};

/***********************************************
* Class Button                                *
**********************************************/
class Button : public Frame
{
public:
virtual void draw()
{
cout<<"Button draw"<<endl;
}
};

class TextButton : public Button
{
public:
virtual void draw()
{
cout<<"TextButton draw"<<endl;
}
};

class ImageButton : public Button
{
public:
virtual void draw()
{
cout<<"CellToolbar draw"<<endl;
}
};

class ThreeDButton : public Button
{
public:
virtual void draw()
{
cout<<"ThreeDButton draw"<<endl;
}
};

/***********************************************
* Class Page                                  *
**********************************************/
class Page : public Frame
{
public:
#define FRAME_MAX   10

Page()
{
m_frame_num = 0;
}

void AddFrame(Frame* frm)
{
if (m_frame_num < FRAME_MAX)
{
m_frame[m_frame_num] = frm;
m_frame_num++;
}
}
virtual void draw()
{
cout<<"page draw"<<endl;
for (int i =0; i < m_frame_num; i++)
{
m_frame[i]->draw();
}
}
private:
Frame* m_frame[FRAME_MAX];
int m_frame_num;
};

class SlidePage : public Page
{
public:
virtual void draw()
{
Page::draw();
cout<<"SlidePage draw"<<endl;
}
};

class VaryPage : public Page
{
public:
virtual void draw()
{
Page::draw();
cout<<"VaryPage draw"<<endl;
}
};
2 Builder

/************************************************************************
* Build ControlBuilder                                                 *
***********************************************************************/

/***********************************************
* Class ControlBuilder                        *
**********************************************/
class ControlBuilder
{
protected:
ControlBuilder(){}
public:
virtual void BuildTitle()   {   }
virtual void BuildMenu()    {   }
virtual void BuildToolbar() {   }
virtual void BuildButton()  {   }
virtual void BuildPage()    {   }

virtual Page* GetPage()     {return NULL;}
};

/***********************************************
* Class GenerralControlBuilder                *
**********************************************/
class GenerralControlBuilder: public ControlBuilder
{
public:
virtual void BuildTitle()
{
Title* tl = new TextTitle();
m_page->AddFrame(tl);
}
virtual void BuildMenu()
{
Menu* mu =  new ListMenu();
m_page->AddFrame(mu);
}
virtual void BuildToolbar()
{
Toolbar* tb =  new CellToolbar();
m_page->AddFrame(tb);
}
virtual void BuildPage()
{
m_page =  new SlidePage();
}

virtual Page* GetPage()
{
return m_page;
}
private:
Page* m_page;
};

/***********************************************
* Class MagicControlBuilder                   *
**********************************************/
class MagicControlBuilder: public ControlBuilder
{
public:
MagicControlBuilder()
{
m_page = NULL;
}

virtual void BuildTitle()
{
Title* tl =  new ImageTitle();
m_page->AddFrame(tl);
}
virtual void BuildMenu()
{
Menu* mu = new ThreeDMenu();
m_page->AddFrame(mu);
}
virtual void BuildToolbar()
{
Toolbar* tb = new FloatToolbar();
m_page->AddFrame(tb);
}
virtual void BuildButton()
{
Button* btn = new ThreeDButton();
m_page->AddFrame(btn);
}
virtual void BuildPage()
{
m_page =  new VaryPage();
}

virtual Page* GetPage()
{
return m_page;
}
private:
Page* m_page;
};


3 Director

/************************************************************************
* Director PageDirector                                                *
***********************************************************************/

/***********************************************
* Class PageDirector                          *
**********************************************/
class PageDirector
{
public:
PageDirector(ControlBuilder* builder)
{
m_builder = builder;
}
virtual Page* CreatePage()
{
m_builder->BuildPage();
m_builder->BuildTitle();
m_builder->BuildMenu();
m_builder->BuildToolbar();
m_builder->BuildButton();

return m_builder->GetPage();
}
private:
ControlBuilder* m_builder;
};
4 Client

/************************************************************************
* Client                                                               *
***********************************************************************/
bool ShowPage(Page* pg)
{
pg->draw();

return true;
}

int main()
{
MagicControlBuilder* mgcCtrl = new MagicControlBuilder();

PageDirector* drctr = new PageDirector(mgcCtrl);
drctr->CreatePage();

Page* pg = mgcCtrl->GetPage();

ShowPage(pg);

return 0;
}


代码转自:http://www.cnblogs.com/bastard/archive/2011/11/21/2257625.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: