一、模式定义
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
二、所体现出的设计原则
Hollywood原则:别调用(打电话给)我们,我们会调用(打电话给)你。
此原则要求永远只能是高层组件(如2中的AbstractClass的模板方法)调用低层组件(如2中的concreteClass 中的primitiveOperation1方法)。低层组件可以挂钩到高层组件中,但永远不能直接调用高层组件;以防止高低组件之间互相依赖。
观察者模式也体现着这样的原则。
三、UML图示
四、应用场景
当算法框架已经确定, 但是小的步骤在不用的情况有不同的实现的时候,最合适用模板方法模式了。 比如说一个绘图的程序,可以绘制各种直线和曲线;在进行线条基本路径绘制完成后,需要进行抗锯齿处理,但有的曲线需要用方法A进行抗锯齿,有的曲线需要用方法B进行抗锯齿。此时线条绘制的基本逻辑框架定义在父类中,但抗锯齿这一小步骤的实现则分布在各个子类中,避免了代码的冗余。
还有一个更加著名的例子,就是Windows编程中的钩子技术,是模板方法模式的最好应用。比如说在自己的程序中挂上一个监控键盘输入的钩子,如果用户输入XXX,就进行相应的操作,不过小心别被360给当成木马给kill了。
五、注意事项
现实中有一些特殊的模板方法模式应用。比如说STL中的std::sort()方法,可以对容器中的对象进行排序,但需要提供一个仿函数,用于容器对象之间的比较。比如说:
vector<myClass> myVector;
Class cmpFunctor {
Public:
Bool operator() (const myclass&ob1, const myclass &ob2){
Return …. //根据myClass的某些特性进行比较
}
};
Std::sort(myVector.begin(), myVector.end(),cmpFunctor);
STL方法sort()本身就是一个模板方法模式的应用,客户提供比较的工具,就是cmpFunctor,在sort()中用函数指针调用此仿函数。这里即便没有继承,我觉得也可以看成是模板方法模式的应用,理解正确么???
六、举例说明
参照四
七、代码示例
维基百科:http://zh.wikipedia.org/wiki/%E6%A8%A1%E6%9D%BF%E6%96%B9%E6%B3%95