您的位置:首页 > 其它

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

2014-05-25 22:57 190 查看
模板方法模式

一个父类【运动会】类

两个子类,一个【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;
}


执行结果如下

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: