模板模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
适用场景
1、 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
3、 控制子类扩展。模板方法只在特定点调用钩子操作,这样就只允许在这些点进行扩展。
采用菜鸟教程的例子,这里用C++实现
#include<iostream>
using namespace std;
//创建一个抽象模板类Game
class Game
{
public:
Game() {};
virtual ~Game() {};
virtual void initialize()=0;
virtual void startplay() =0;
virtual void endplay() =0;
void play() { initialize(); startplay(); endplay(); }; //不能使用virtual
};
//创建继承模板类Game的Cricket
class Cricket:Game
{
public:
Cricket() {};
virtual ~Cricket() {};
void initialize() { cout << "Cricket: initialize game" << endl; };
void startplay() { cout << "Cricket: startplay game" << endl; };
void endplay() { cout << "Cricket: endplay game" << endl; };
void play() { cout << "Cricket" << endl; };
};
//创建继承模板类Game的Football
class Football :Game
{
public:
Football() {};
virtual ~Football() {};
void initialize() { cout << "Football: initialize game" << endl; };
void startplay() { cout << "Football: startplay game" << endl; };
void endplay() { cout << "Football: endplay game" << endl; };
void play() { cout << "Football" << endl; };
};
int main()
{
Game *g1 = (Game*)new Cricket();
g1->play();
cout << endl;
Game *g2 = (Game*)new Football();
g2->play();
delete g1;
g1 = NULL;
delete g2;
g2 = NULL;
return 0;
}
在visual studio 2015上运行结果: