模版方法模式(Template Method Pattern)转

转自:http://wuhongyu.iteye.com/blog/2026243

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

 

    模版方法模式适用于一组固定流程的算法,在抽象类中定义一组算法,由子类去实现,抽象类提供一个公开方法,确定调用这组算法的步骤。

 

    比如,我们去营业厅办理一张手机卡,不论是移动、联通还是电信,流程都是先办卡、再选号,而办卡和选号的动作每个运营商自己去实现。

    我们定义一个运营商的抽象类,有两个抽象的方法办卡和选号,还有一个方法就是提供服务,调用办卡和选号:

 

Java代码    收藏代码
  1. public abstract class ServiceOperator {  
  2.     protected abstract void requestCard();  
  3.     protected abstract void selectNumber();  
  4.       
  5.     final public void service(){  
  6.         this.requestCard();//先办卡  
  7.         this.selectNumber();//再选号  
  8.     }  
  9. }  

     分别定义两个实现类,移动和联通:

 

 

Java代码    收藏代码
  1. public class ChinaMobile extends ServiceOperator {  
  2.     @Override  
  3.     protected void requestCard() {  
  4.         System.out.println("办一张中国移动电话卡");  
  5.     }  
  6.     @Override  
  7.     protected void selectNumber() {  
  8.         System.out.println("选一个中国移动电话号");  
  9.     }  
  10. }  

 

Java代码    收藏代码
  1. public class ChinaUnicom extends ServiceOperator {  
  2.     @Override  
  3.     protected void requestCard() {  
  4.         System.out.println("办一张中国联通电话卡");  
  5.     }  
  6.     @Override  
  7.     protected void selectNumber() {  
  8.         System.out.println("选一个中国联通电话号");  
  9.     }  
  10. }  

     这样,不论哪个运营商要修改办卡或是选号的操作时,对我们的整个流程不会产生任何影响了。对于办卡和选号这两个动作,称之为基本方法,由具体的实现类去完成;提供服务的方法称之为模版方法,定义了基本方法的调用流程。

 

 

测试类:

 

Java代码    收藏代码
  1. public class Test {  
  2.     /** 
  3.      * 模版方法模式(Template Method Pattern)——定义一个操作中算法的框架,而将一些步骤延迟到子类中。 
  4.      * 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 
  5.      *  
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         ServiceOperator serviceOperator = new ChinaUnicom();  
  10.         serviceOperator.service();  
  11.     }  
  12. }  

 

 

    模版方法模式还可以进一步进行扩展。对于某些基本方法的调用与否,可能需要一些条件,这时,我们可以在模版抽象类中定义一个控制这些条件的方法,称之为钩子方法(Hood Method),由子类去设定这个条件,以使不同的实现类能够做出不同的处理。

    比如,手机卡丢了,要去营业厅补一张,移动说,丢了没办法,重办卡、重选号吧,联通为了抢客户,就说,办张卡,号还用原来那个,不用选了。为了实现这个逻辑,我们在运营商的抽象类中增加一个判断是否为新用户的方法,如果是新用户,就不调用选号的方法了:

Java代码    收藏代码
  1. public abstract class ServiceOperator {  
  2.     protected abstract void requestCard();//基本方法  
  3.     protected abstract void selectNumber();//基本方法  
  4.       
  5.     //模版方法  
  6.     final public void service(){  
  7.         this.requestCard();//先办卡  
  8.         if(this.isNewCustomer()){  
  9.             this.selectNumber();//再选号  
  10.         }  
  11.     }  
  12.       
  13.     //钩子方法(Hood Method)  
  14.     protected boolean isNewCustomer(){  
  15.         return true;  
  16.     }  
  17. }  

    移动不管他是新用户还是老用户,全当新用户处理:

Java代码    收藏代码
  1. public class ChinaMobile extends ServiceOperator {  
  2.     @Override  
  3.     protected void requestCard() {  
  4.         System.out.println("办一张中国移动电话卡");  
  5.     }  
  6.     @Override  
  7.     protected void selectNumber() {  
  8.         System.out.println("选一个中国移动电话号");  
  9.     }  
  10.     @Override  
  11.     protected boolean isNewCustomer() {  
  12.         return true;  
  13.     }  
  14. }  

    联通让用户自己决定,老用户就可以不选号,光办卡:

Java代码    收藏代码
  1. public class ChinaUnicom extends ServiceOperator {  
  2.     private boolean isNewCustomer = true;  
  3.     @Override  
  4.     protected void requestCard() {  
  5.         System.out.println("办一张中国联通电话卡");  
  6.     }  
  7.     @Override  
  8.     protected void selectNumber() {  
  9.         System.out.println("选一个中国联通电话号");  
  10.     }  
  11.     @Override  
  12.     protected boolean isNewCustomer() {  
  13.         return this.isNewCustomer;  
  14.     }  
  15.     public void setNewCustomer(boolean isNewCustomer) {  
  16.         this.isNewCustomer = isNewCustomer;  
  17.     }  
  18. }  

测试类:

Java代码    收藏代码
  1. public class Test {  
  2.     /** 
  3.      * 模版方法模式(Template Method Pattern)——定义一个操作中算法的框架,而将一些步骤延迟到子类中。 
  4.      * 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 
  5.      *  
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         ChinaUnicom chinaUnicom = new ChinaUnicom();  
  10.         chinaUnicom.setNewCustomer(false);  
  11.         chinaUnicom.service();  
  12.     }  
  13. }  

 

 

你可能感兴趣的:(template)