github地址:https://github.com/lining91/TemplatePattern
模板方法模式:
定義一個操作中的算法的骨架,將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
模板方法模式提供了一個很好的代碼複用平臺,通過把不變行爲搬到超類中,取出子類中重複代碼來將代碼複用最大化,而且代碼容易修改。
模板方法提供了一個框架,可以方便其他同類信息加入。
模板方法中,任何步驟都可以抽象出來,由子類負責實現。確保了算法的結構保持不變,同時由子類提供部分實現。
在要完成在某一細節層次一致的一個過程或一系列步驟,但個別步驟在更詳細的層次上的實現可能不同時,應該考慮用模板方法模式來處理。
問題描述:
輸出籃球運動員的信息(姓名,年齡,隊伍)。
解析:
由於輸出的信息只有年齡,性別,隊伍不一樣,所以將共有的部分提取出來放到CInfoTemplate信息模板類中,運動員的輸出信息通過ShowPlayerInfo()來實現。運動員的具體信息Name(),Age(),Team()放在各自的具體子類中。
有的運動員可能沒有隊伍,所以使用函數HaveTeam()來處理運動員是否需要隊伍信息。
代碼如下:
TemplatePattern.h文件中:
#include <string>
// 輸出信息模板類
class CInfoTemplate
{
public:
void ShowPlayerInfo()
{
cout << " The player info : " << endl;
cout << " Name is : " << Name() << endl;
cout << " Age is : " << Age() << endl;
if ( HaveTeam() )
cout << " Team is : " << Team() << endl;
else
cout << " No Team !" << endl;
}
public:
virtual string Name() = 0;
virtual int Age() = 0;
virtual string Team() = 0;
// 通過該函數,在子類決定是否使用擁有隊伍
virtual bool HaveTeam(){ return true; }
};
// 具體運動員信息A
class CPlayer_A : public CInfoTemplate
{
string Name() { return " Kobe "; }
int Age() { return 38; }
string Team() { return " Laker "; }
};
// 具體運動員信息B
class CPlayer_B : public CInfoTemplate
{
string Name() { return " James "; }
int Age() { return 33; }
string Team() { return "Heat"; }
};
class CPlayer_C : public CInfoTemplate
{
string Name() { return "T-MAC"; }
int Age() { return 37; }
bool HaveTeam() { return false; } // 該運動員暫未有隊伍
string Team() { return ""; }
};
main.cpp文件中:
#include <iostream>
using namespace std;
#include "TemplatePattern.h"
void main()
{
CInfoTemplate* pPlayer = new CPlayer_A();
if ( pPlayer == NULL )
return;
pPlayer->ShowPlayerInfo();;
cout << "------------------------------------------" << endl;
pPlayer = new CPlayer_B();
pPlayer->ShowPlayerInfo();
cout << "------------------------------------------" << endl;
pPlayer = new CPlayer_C();
pPlayer->ShowPlayerInfo();
delete pPlayer;
pPlayer = NULL;
system("pause");
return;
}
運行結果如下: