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

本文介绍构建模式,一种设计模式,用于创建复杂对象的结构化方法。通过定义Director和Builder角色,该模式允许创建不同组合的组件,如界面元素、菜单、工具栏等,同时遵循开闭原则,易于扩展新功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值