在父类中定义了算法的骨架,其骨架中包含(部分包含)可供子类重写的算法,即允许子类在不改变算法结构的前提下重定义算法的某些特定步骤。
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; }
|
模板模式和策略模式确实很容易混淆,但如果细细对比还是可以发现两者的区别。模板模式是已经搭建好行为框架,然后子类重定义框架中的行为(部分行为),其执行逻辑是被限制在框架内的。但是策略模式的整个算法行为没有框架,而是完全让子类自己实现的,所以框架的整个逻辑由自己掌控的。
当然,下面的区别总结来源于其他网站:
- 模板方法基于继承机制: 它允许你通过扩展子类中的部分内容来改变部分算法。 策略模式基于组合机制: 你可以通过对相应行为提供不同的策略来改变对象的部分行为。
- 模板方法在类层次上运作, 因此它是静态的。 策略在对象层次上运作, 因此允许在运行时切换行为。