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;
}
运行结果如下: