模板方法模式

模板方法模式的定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

来举一个.NET中典型的使用模板方法模式的例子,List的Sort方法中有一个重载方法的一个参数是IComparer比较器,这个IComparer接口中定义了一个方法Compare(object x,object y),我们在用的时候就可以自己写一个实现IComparer的类,然后传给Sort方法,让他按照我们的比较规则来比较元素的大小。这就是典型的模板方法模式的例子,因为不管Sort内部使用的快速排序还是冒泡排序,其算法的骨架是定下了,只是在算法的某些特定步骤(这里是比较两个元素的大小)交给其他类。显然这也符合模板方法模式的定义,虽然这里用的是回调方法(回调方法不一定非要通过委托,这里使用接口也可以)。而标准的模板方法模式是将这些变化的步骤定义在其子类的。我们来看一下其结构图:

程序设计里一个很重要的思考点是“变与不变”,也就是分析程序中哪些功能是可变的,哪些功能是不变的,然后把不变的部分抽象出来,进行公共的实现,把变化的部分分离出去,用接口来封装隔离,或者是用抽象类来约束子类的行为。

模板方法模式很好的体现了这一点。模板类实现的就是不变的方法和算法的骨架,而需要变化的地方,都通过抽象方法,把具体的实现延迟到子类中了,而且还通过父类的定义约束了子类的行为,从而使系统能有更好的复用性和扩展性。

如上图,AbstractClass里的templateMethod就是定义算法骨架的方法,在这个算法方法里会在适当的时候调用抽象方法doPrimitiveOperation1或doPrimitiveOperation2完成算法的要求。而doPrimitiveOperation1或doPrimitiveOperation2这俩方法的真正实现是在ConcreteClass里实现的。doPrimitiveOperation1或doPrimitiveOperation2既可以是原语方法也可以是钩子方法。所谓原语方法就是前面说的抽象方法,实现由具体子类实现。钩子方法就是父类有默认实现的方法,子类可以选择覆盖这些方法或直接使用父类的默认实现。

 

模板方法模式的本质:固定算法骨架。

posted @ 2015-07-30 12:23  何塞穆里尼奥  阅读(321)  评论(0编辑  收藏  举报