设计模式之---模板方法模式

 一、模式定义

        模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

二、所体现出的设计原则

       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

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注