模板模式

在父类中定义了算法的骨架,其骨架中包含(部分包含)可供子类重写的算法,即允许子类在不改变算法结构的前提下重定义算法的某些特定步骤。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Game {
public:
// 如下方法由 继承者 重写
virtual void Start() = 0;
virtual void Process() = 0;
virtual void End() = 0;

void Play() { // 算法骨架
Start();
Process();
End();
}
};

class FootBall : public Game{
public:
void Start() {
cout << " FootBall Start " << endl;
}
void Process() {
cout << " FootBall Process " << endl;
}
void End() {
cout << " FootBall End " << endl;
}
};

class BasketBall : public Game {
public:
void Start() {
cout << " BasketBall Start " << endl;
}
void Process() {
cout << " BasketBall Process " << endl;
}
void End() {
cout << " BasketBall End " << endl;
}
};

客户端测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
int main(int argc,char* argv[]) {

shared_ptr<Game> g = make_shared<BasketBall>();
g->Play();

return 0;
}
/*
BasketBall Start
BasketBall Process
BasketBall End
*/

模板模式和策略模式确实很容易混淆,但如果细细对比还是可以发现两者的区别。模板模式是已经搭建好行为框架,然后子类重定义框架中的行为(部分行为),其执行逻辑是被限制在框架内的。但是策略模式的整个算法行为没有框架,而是完全让子类自己实现的,所以框架的整个逻辑由自己掌控的。

当然,下面的区别总结来源于其他网站:

  • 模板方法基于继承机制: 它允许你通过扩展子类中的部分内容来改变部分算法。 策略模式基于组合机制: 你可以通过对相应行为提供不同的策略来改变对象的部分行为。
  • 模板方法在类层次上运作, 因此它是静态的。 策略在对象层次上运作, 因此允许在运行时切换行为。