模版方法模式

系统 1682 0
模版方法(Template Method)模式 :属于类的行为模式,它的用意是定义一个操作中的算法的骨架,将一些操作延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模版方法模式的类图如下:
模版方法模式有两个角色:
1、 抽象模版(Abstract Template)角色 :定义了一个或多个抽象操作,同时定义了一个模版方法,它是一个具体的方法,作为抽象模版的骨架。实际的逻辑在抽象操作中,推迟到子类实现。
2、 实现模版(Concrete Template)角色 :实现了抽象模版中一个或多个抽象方法。
 
这里举个模拟计算器的例子来说模版方法模式,我们知道计算器计算的时候首先获取操作数1,然后获取操作数2,再进行加减乘除运算,最后显示在屏幕上,对于计算器来说不管是计算加减乘除那一种,都是要获取两个操作数,计算后再显示。可以建立以下类图模型:
模版方法模式
 
 举例代码如下:
Java代码   收藏代码
  1. package  templateMethod;  
  2. /**  
  3.  *   
  4.  *作者:alaric  
  5.  *时间:2013-8-9下午8:15:18  
  6.  *描述:抽象模版角色  
  7.  */   
  8. public   abstract   class  AbstractClass {  
  9.   
  10.      /**  
  11.      *   
  12.      *作者:alaric  
  13.      *时间:2013-8-9下午8:17:00  
  14.      *描述:模版方法  
  15.      */   
  16.      public   final   void  templateMethod(){  
  17.          int  m = getNum1();  
  18.          int  n = getNum2();  
  19.          int  s = operate(m ,n);  
  20.         show(s);  
  21.     }  
  22.   
  23.      /**  
  24.      *   
  25.      *作者:alaric  
  26.      *时间:2013-8-9下午8:21:49  
  27.      *描述:获取第一个操作数  
  28.      */   
  29.      private   int  getNum1(){  
  30.          return   8 ;  
  31.     }  
  32.      /**  
  33.      *   
  34.      *作者:alaric  
  35.      *时间:2013-8-9下午8:21:49  
  36.      *描述:获取第二个操作数  
  37.      */   
  38.      private   int  getNum2(){  
  39.          return   2 ;  
  40.     }  
  41.      /**  
  42.      *   
  43.      *作者:alaric  
  44.      *时间:2013-8-9下午8:19:53  
  45.      *描述:算法  
  46.      */   
  47.      public   abstract   int  operate( int  m, int  n);  
  48.      /**  
  49.      *   
  50.      *作者:alaric  
  51.      *时间:2013-8-9下午8:20:59  
  52.      *描述:显示  
  53.      */   
  54.      public   void  show( int  s){  
  55.         System.out.println( "结果是:" + s);  
  56.     }  
  57.       
  58. }  
 
Java代码   收藏代码
  1. package  templateMethod;  
  2. /**  
  3.  *   
  4.  *作者:alaric  
  5.  *时间:2013-8-9下午8:57:06  
  6.  *描述:加法  
  7.  */   
  8. public   class  AddClass  extends  AbstractClass{  
  9.   
  10.      @Override   
  11.      public   int  operate( int  m, int  n) {  
  12.          return  m+n;  
  13.     }  
  14.   
  15. }  
 
Java代码   收藏代码
  1. package  templateMethod;  
  2. /**  
  3.  *   
  4.  *作者:alaric  
  5.  *时间:2013-8-9下午8:57:24  
  6.  *描述:减法  
  7.  */   
  8. public   class  SubClass  extends  AbstractClass{  
  9.   
  10.      @Override   
  11.      public   int  operate( int  m, int  n) {  
  12.          return  m-n;  
  13.     }  
  14.   
  15. }  
 
Java代码   收藏代码
  1. package  templateMethod;  
  2. /**  
  3.  *   
  4.  *作者:alaric  
  5.  *时间:2013-8-9下午8:57:38  
  6.  *描述:乘法  
  7.  */   
  8. public   class  MultiClass  extends  AbstractClass{  
  9.   
  10.      @Override   
  11.      public   int  operate( int  m, int  n) {  
  12.          return  m*n;  
  13.     }  
  14.   
  15. }  
 
Java代码   收藏代码
  1. package  templateMethod;  
  2. /**  
  3.  *   
  4.  *作者:alaric  
  5.  *时间:2013-8-9下午8:57:50  
  6.  *描述:除法  
  7.  */   
  8. public   class  DivClass  extends  AbstractClass{  
  9.   
  10.      @Override   
  11.      public   int  operate( int  m, int  n) {  
  12.          return  m/n;  
  13.     }  
  14.   
  15. }  
 
Java代码   收藏代码
  1. package  templateMethod;  
  2. /**  
  3.  *   
  4.  *作者:alaric  
  5.  *时间:2013-8-9下午8:14:34  
  6.  *描述:测试类  
  7.  */   
  8. public   class  Client {  
  9.   
  10.      /**  
  11.      *作者:alaric  
  12.      *时间:2013-8-9下午8:14:28  
  13.      *描述:  
  14.      */   
  15.      public   static   void  main(String[] args) {  
  16.          //加   
  17.         AbstractClass c1 =  new  AddClass();  
  18.         c1.templateMethod();  
  19.          //减   
  20.         AbstractClass c4 =  new  SubClass();  
  21.         c4.templateMethod();  
  22.          //乘   
  23.         AbstractClass c2 =  new  MultiClass();  
  24.         c2.templateMethod();  
  25.          //除   
  26.         AbstractClass c3 =  new  DivClass();  
  27.         c3.templateMethod();  
  28.           
  29.   
  30.     }  
  31.   
  32. }  
 运行结果:
结果是:10
结果是:6
结果是:16
结果是:4
整个计算过程(取操作数,计算,显示)使用了模版方法模式,模版方法规定程序实现步骤,并且在子类中无法改变,而子类必须实现abstract修饰的抽象方法,不同的实现类可以有不同的实现,这也是模版方法模式的用意。如果你了解策略模式,你会发现在每条算法的封装上很像策略模式,而又不是策略模式,策略模式是利用委派的方法提供不同的算法行为,而模版方法是利用继承来提供不同的算法行为的。

模版方法模式


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论