首页 > 代码库 > 【设计模式】模板方法模式

【设计模式】模板方法模式

 

模板方法模式

 

一个父类【运动会】类

两个子类,一个【CClass1】类,一个【CClass2】类,班级类是运动会类的子类,父类制定了运动会的流程(算法的逻辑架构),子类分别去实现流程中的具体实现。

子类不需要重写流程,只需要重写流程中每一项的具体内容。

以此为例,流程就是先干什么、后干什么、再干什么,而每一项就是分别干的内容。

 

 

/************************************************************************
设计模式
模板方法模式

模板方法的大概思想是:父类指定某种流程或规则,每个子类在为该流程制定详细的工作。

下面demo以运动会为例,上学的时候开运动会的日子还是比较开心的,因为不用上课。
运动会总是有一定的流程的,比如每个有班级进场、团队展示、运动员比赛、写稿子
等等。

************************************************************************/

//【运动会】类
class CSportsMeeting
{
public:
    CSportsMeeting(string strClassName);
    virtual ~CSportsMeeting();
    virtual void Jinchang() = 0;  //进场
    virtual void Zhanshi() = 0;   //展示,子类去重写这两个虚函数的实现

    //运动会流程,子类不需要重写此函数,这个函数指定了流程和逻辑框架
    void SportsSchedule();        

protected:
    string m_strClassName;  //班级名
};

CSportsMeeting::CSportsMeeting(string strClassName) : m_strClassName(strClassName){}
CSportsMeeting::~CSportsMeeting(){}
void CSportsMeeting::SportsSchedule()
{
    //进场
    Jinchang();

    //展示
    Zhanshi();
}

 

 

 

//【班级1类】
class CClass1 : public CSportsMeeting
{
public:
    CClass1(string strClassName);
    virtual ~CClass1();
    virtual void Jinchang();
    virtual void Zhanshi(); 
};

CClass1::CClass1(string strClassName) : CSportsMeeting(strClassName){}
CClass1::~CClass1(){}
void CClass1::Jinchang()
{
    cout << "班级 " <<m_strClassName<<" 进场啦,哈哈\r\n";
}

void CClass1::Zhanshi()
{
    cout << "班级 " << m_strClassName<<" 展示啦,我们是风骚型的啦!\r\n";
}

//////////////////////////////////////////////////////////////////////////

//【班级2类】
class CClass2 : public CSportsMeeting
{
public:
    CClass2(string strClassName);
    virtual ~CClass2();
    virtual void Jinchang();
    virtual void Zhanshi(); 
};

CClass2::CClass2(string strClassName) : CSportsMeeting(strClassName){}
CClass2::~CClass2(){}

void CClass2::Jinchang()
{
    cout << "班级 "<<m_strClassName<< " 进程啦,都看过来!\r\n";
}

void CClass2::Zhanshi()
{
    cout << "班级 "<<m_strClassName<<" 展示啦,我们是呆萌型的,么么哒!\r\n";
}

 

 

 客户端代码

客户端用子类去实例化每个具体的类,然后将指针赋值给父类指针,父类指针去调用父类的未重写的函数SportsShedule,在此函数中调用的函数为被子类重写了虚函数。

int _tmain(int argc, _TCHAR* argv[])
{
    CSportsMeeting* pSport = new CClass1("三年二班");
    pSport->SportsSchedule();

    cout<<endl<<endl;

    CSportsMeeting* pSport2 = new CClass2("高三四班");
    pSport2->SportsSchedule();


    cout<<endl<<endl;

    return 0;
}

 

 

 

 执行结果如下