概述
在做有些事情的时候,你会发现每次的步骤都一样,只是其中的一两个步骤完成的方式会稍微有点差别。考虑一下你冲咖啡和泡茶的过程:
冲咖啡 1、 盛一些水 2、 把咖啡倒入水中泡一会儿 3、 将泡好的咖啡盛到杯子里 |
泡茶 1、 盛一些水 2、 将茶叶放入水中泡一小会儿 3、 将泡好的茶叶盛到杯子里 |
于是我们马上可以得到两个类:
class Coffer { public: void Prepare() { BoilWater(); BrewCoffeeGrinds(); PourInCup(); } protected: void BoilWater() { cout << “Boiling some water” << endl; } void BrewCoffeeGrinds() { cout << “Dripping Coffee through filter” << endl; } void PourInCup() { cout << “Pouring into cup” << endl; } };
class Tea { public: void Prepare() { BoilWater(); SteepTeaBag(); PourInCup(); } protected: void BoilWater() { cout << “Boiling some water” << endl;} void SteepTeaBag() { cout << “Steep the tea” << endl; } void PourInCup() { cout << “Pouring into cup” << endl; } }; |
代码出来了,但是你会发现,这两个类里边有很多重复的代码,唯一不同仅仅制作过程中的第二步有些差别,于是我们马上就想到了一个方法,把相同的部分移动到他们公共的基类离去。恩,这是个不错的想法,动手吧。
class CaffeineBeverage { public: void Prepare() { BoilWater(); Brew(); PourInCup(); } protected: void BoilWater() { cout << “Boiling some water” << endl; } void PourInCup() { cout << “Pouring into cup” << endl; }
virtual void Brew(); };
class Coffer : public CaffeineBeverage { protected: virtual void Brew() { cout << “Dripping Coffee through filter” << endl; } };
class Tea : public CaffeineBeverage { protected: virtual void Brew() { cout << “Steep the tea” << endl; } };
|
这个类层次很简单,UML结构如下:
我们来写一个测试代码看看情况如何:
void main() { CaffeineBeverage* p = NULL; p = new Coffee; p->Prepare(); delete p;
p = new Tea; p->Prepare(); delete p; } |
看看输出什么:
Boiling some water Dripping Coffee through filter Pour into cup Boiling some water Steep the tea Pour into cup |
基本上,我们已经看到了Template Method模式的样子了。Template Method模式的规范UML形式如下:
Template Method模式其实应用很广泛,以至于很多时候你用了该模式而没有意识到你已经使用了它。它使用了OOP原则中的Dependency Inversion Principles原则,即上层模块的某些方法实现需要依赖底层模块的实现。这样控制权掌握在上层模块,而实现却在底层模块中。Template Method模式和Strategy模式其实是解决了同一个问题,只是使用了不同的方式而已。相比起来,Strategy使用组合而不是继承,灵活性更大一些,但是Strategy的Context使用了委托技术,在时间和空间上都无法和Template Method模式相比。细看Template Method模式,和一般的多态技术基本上没有区别。其实说白了,设计模式就是OOP设计经验的积累,为了便于交流,人们便在一个特定场景中给特定的结构框架去了一个名字,它们的目标都是为了:松耦合、高内聚。
最后
以上就是小巧鞋垫为你收集整理的Template Method的全部内容,希望文章能够帮你解决Template Method所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复