模版方法模式(Template Method Pattern)——定义一个操作中算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模版方法模式适用于一组固定流程的算法,在抽象类中定义一组算法,由子类去实现,抽象类提供一个公开方法,确定调用这组算法的步骤。
比如,我们去营业厅办理一张手机卡,不论是移动、联通还是电信,流程都是先办卡、再选号,而办卡和选号的动作每个运营商自己去实现。
我们定义一个运营商的抽象类,有两个抽象的方法办卡和选号,还有一个方法就是提供服务,调用办卡和选号:
public abstract class ServiceOperator { protected abstract void requestCard(); protected abstract void selectNumber(); final public void service(){ this.requestCard();//先办卡 this.selectNumber();//再选号 } }
分别定义两个实现类,移动和联通:
public class ChinaMobile extends ServiceOperator { @Override protected void requestCard() { System.out.println("办一张中国移动电话卡"); } @Override protected void selectNumber() { System.out.println("选一个中国移动电话号"); } }
public class ChinaUnicom extends ServiceOperator { @Override protected void requestCard() { System.out.println("办一张中国联通电话卡"); } @Override protected void selectNumber() { System.out.println("选一个中国联通电话号"); } }
这样,不论哪个运营商要修改办卡或是选号的操作时,对我们的整个流程不会产生任何影响了。对于办卡和选号这两个动作,称之为基本方法,由具体的实现类去完成;提供服务的方法称之为模版方法,定义了基本方法的调用流程。
测试类:
public class Test { /** * 模版方法模式(Template Method Pattern)——定义一个操作中算法的框架,而将一些步骤延迟到子类中。 * 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 * * @param args */ public static void main(String[] args) { ServiceOperator serviceOperator = new ChinaUnicom(); serviceOperator.service(); } }
模版方法模式还可以进一步进行扩展。对于某些基本方法的调用与否,可能需要一些条件,这时,我们可以在模版抽象类中定义一个控制这些条件的方法,称之为钩子方法(Hood Method),由子类去设定这个条件,以使不同的实现类能够做出不同的处理。
比如,手机卡丢了,要去营业厅补一张,移动说,丢了没办法,重办卡、重选号吧,联通为了抢客户,就说,办张卡,号还用原来那个,不用选了。为了实现这个逻辑,我们在运营商的抽象类中增加一个判断是否为新用户的方法,如果是新用户,就不调用选号的方法了:
public abstract class ServiceOperator { protected abstract void requestCard();//基本方法 protected abstract void selectNumber();//基本方法 //模版方法 final public void service(){ this.requestCard();//先办卡 if(this.isNewCustomer()){ this.selectNumber();//再选号 } } //钩子方法(Hood Method) protected boolean isNewCustomer(){ return true; } }
移动不管他是新用户还是老用户,全当新用户处理:
public class ChinaMobile extends ServiceOperator { @Override protected void requestCard() { System.out.println("办一张中国移动电话卡"); } @Override protected void selectNumber() { System.out.println("选一个中国移动电话号"); } @Override protected boolean isNewCustomer() { return true; } }
联通让用户自己决定,老用户就可以不选号,光办卡:
public class ChinaUnicom extends ServiceOperator { private boolean isNewCustomer = true; @Override protected void requestCard() { System.out.println("办一张中国联通电话卡"); } @Override protected void selectNumber() { System.out.println("选一个中国联通电话号"); } @Override protected boolean isNewCustomer() { return this.isNewCustomer; } public void setNewCustomer(boolean isNewCustomer) { this.isNewCustomer = isNewCustomer; } }
测试类:
public class Test { /** * 模版方法模式(Template Method Pattern)——定义一个操作中算法的框架,而将一些步骤延迟到子类中。 * 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 * * @param args */ public static void main(String[] args) { ChinaUnicom chinaUnicom = new ChinaUnicom(); chinaUnicom.setNewCustomer(false); chinaUnicom.service(); } }
相关推荐
——————————————————————————————————————————————
Java设计模式学习笔记
总结了java开发中的21种设计模式,详解和例子,带书签的pdf格式,方便阅读!
学习Java设计模式的笔记,标注了其中重要的要点,如果有需要的小伙伴,自行下载哦
良葛格————JavaJDK5.0学良葛格————JavaJDK5.0学习笔记PDF.rar习笔记PDF.rar良葛格良葛格————JavaJDK5.0学习笔记PDF.rar————JavaJDK5.0学习笔记PDF.rar良葛格————JavaJDK5.0学习笔记PDF.rar良...
Java JDK 6学习笔记——ppt简体版.rar
java设计模式的学习笔记,其中包含各种模式的代码实现
Java JDK 6学习笔记——ppt简体版加课本代码
Java JDK 6学习笔记——ppt简体版
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
良葛格的Java学习笔记~讲解得非常详细。JDK5.0的~是Java入门的不错选择。
图解java设计模式_学习笔记_java开发解压密码为twj123
Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip ...