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

 一、模式定义

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


二、所体现出的设计原则

       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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值