模板方法模式

    在开发过程中,经常会出现这种情况:很多功能都包含几步骤来组合完成,其中一部分步骤几乎是固定不变的,剩余部分才会根据不同情况有所差异。如果每个这种功能都吧所有步骤重新定义实现一遍,会很麻烦,重复。例如JDBC的传统使用,很多时候为了一个小操作,不得不管理连接资源的打开/关闭,异常的处理。
    为了提高代码的重用性,和系统的灵活性,可以使用一种模式:模板方法模式,它就是为上述情况而设计的。在模板方法模式中,将“步骤”称为“基本方法”,如jdbc的打开/关闭连接等;将把基本方法组合起来实现功能的方法称为“模板方法”,如使用jdbc执行数据库操作的整个操作序列。
           
    模板方法模式定义如下:

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

       模板方法模式是一种基于继承的代码复用技术。通过这种模式,可以将一些可重用的/相对固定的步骤在抽象父类中以基本方法的形式实现,而需要变化的步骤,再抽象父类中只进行定义,延迟到每个具体的子类中去实现。这样既重用了固定步骤,又使模式带有一定的扩展性,通过不同的子类实现,最终实现不同的功能。

    

    上图描述了模板方法模式的结构,比较简单。可以看出是由两部分组成:

  • 抽象父类 : 定义了算法框架。
  • 具体子类 : 覆盖在父类中声明的抽象基本方法以完成具体的算法实现。当然,也可以覆盖父类已经实现的既本方法。
    上图中的TemplateMethod()既为模板方法,它在父类中实现,通过调用其它基本方法来实现算法框架。

    PrimitiveOpration1 PrimitiveOpration2 PrimitiveOpration3为基本方法,是模板方法的组成部分。既本方法又可以分为三类:

  1. 抽象方法  : 由抽象父类声明,在具体子类实现。
  2. 具体方法 :由抽象父类或具体子类的声明实现。子类可以覆盖也可以直接继承。
  3. 钩子方法 :由父类声明并实现,子类可能会加以扩展。一般在父类中提供一个空实现,或者控制某些步骤的默认实现。例如:

  1. public void TemplateMethod(){  
  2. Open();  
  3. Display();  
  4. //通过钩子方法来确定某步骤是否执行  
  5. if (IsPrint()) {  
  6.     Print();  
  7. }  
  8. //钩子方法  
  9. public bool IsPrint(){  
  10.     return true;  
  11. }  
   IsPrint既为一个钩子方法,它可以控制Print方法的执行,在父类中提供了默认实现return true。

  1. abstract class AbstractClass {  
  2. //模板方法  
  3. public void TemplateMethod() {  
  4.         PrimitiveOperation1();  
  5.         PrimitiveOperation2();  
  6.         PrimitiveOperation3();  
  7. }  
  8. //基本方法—具体方法  
  9. public void PrimitiveOperation1() {  
  10.     //实现代码  
  11. }  
  12. //基本方法—抽象方法  
  13. public abstract void PrimitiveOperation2(); 
  14. //基本方法—钩子方法  
  15. public virtual void PrimitiveOperation3()     
  16. {  }  
    例子中,PrimitiveOperation3这个钩子方法,父类提供了默认的空实现。子类可已选择是否对他进行覆盖。

    通过上面两个例子可以看出,子类可以有选择的实现钩子方法,对父类中模板方法进行约束,从而实现对父类模板方法的反向控制。

    总结:
    模板方法体现了面向对象的诸多重要思想,被广发应用于框架设计中,如Spring。在自己设计的框架中,使用也非常频繁。
    优点:代码复用性高;不同子类可以实现不同功能实现,负责单一职责原则和开闭原则。
    缺点:如果需要实现的功能很多,那么子类就会相应增加数量,使系统变得庞大、抽象。此时,可以使用桥接模式进行设计。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值