23种设计模式(4)--builder模式
2016-05-17 15:02
465 查看
builder模式中的关键为director和builder,其中director为一个对象的的多个组成部分提供接口,而builder为组成对象一个个部分的实现细节。结构如下:
以下代码中,每一种builder代表一种产品,当然在Director中,可以使用不同的组合方式实现不同结构的组合。在代码重构时,添加新产品时只需要添加一种builder即可,满足扩展开放,修改封闭的原则。
代码实现
1 Product
3 Director
代码转自:http://www.cnblogs.com/bastard/archive/2011/11/21/2257625.html
以下代码中,每一种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
相关文章推荐
- CIImage CGImage UIImage 区别
- 【一天一道LeetCode】#52. N-Queens II
- 【一天一道LeetCode】#52. N-Queens II
- UVa136 Ugly Numbers (priority_queue)
- 坑爹的ndk-build
- UICollectionView实现无限滚动(理解花了我不少时间)
- 【一天一道LeetCode】#51. N-Queens
- 【一天一道LeetCode】#51. N-Queens
- 1.UIAlertController
- hdu3436 Queue-jumpers(Splay)
- UIProgressView进度条
- BlockingQueue的使用
- UISegmentedControl的用法
- druid1.0.19使用注意事项
- UINavgationController中覆写preferredStatusBarStyle方法不执行的问题
- 如果在Scope中的Preview中发起一个query请求
- EXC_BAD_ACCESS on UIAlertview code=1
- 25个优秀的UI设计资源下载
- java GUI 图形界面编程
- UIBezierPath精讲(二)