一、模板设计的概念
在生活中,制作不同的饮料虽然具体的实现过程不同,但是它们的大体流程都是一样的,都要经过烧水、把水倒入杯子里、主料放入杯子中、辅料放入杯子中等一系列流程。不同的饮料差别在于放的主料和辅料不同和是否烧水。因此在主类中,我们可以定义这一系列流程,以及它们共有方法的实现(如烧水、把水放到杯子里)。流程中的非共有的部分,可以定义为抽象方法,由子类具体实现。同时,还可以设置是否烧水这一属性,从而决定流程中是否要烧水。而在子类中,可以具体定义实现各自不同的部分。这一系列流程就是模板方法,显而易见,模板方法中定义了一套执行的逻辑顺序(算法)。
模板方法模式在书中的定义为:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。这里的一个方法就是主类中的模板方法,延迟到子类中的步骤就是主类中的抽象方法,子类各自不同的部分。
二、模板设计模式的代码形式
//主类
abstract class mainClass{
//模板方法,通用流程,故用final修饰
public final void templateMethods{
//定义算法执行程序,可以采用一些流程控制
this.methodOptional1();
this.methodOptional2();
//通过isSupport()控制流程
if(this.isSupport()){
this.methodOptional3();
}
this.methodOptional4();
this.methodOptional5();
}
public final void methodOptional1(){
//有模板提供了一定的默认实现,子类可以根据具体情况进行覆写。
}
public final void methodOptional2(){
//有模板提供了一定的默认实现,子类可以根据具体情况进行覆写。
}
public final void methodOptional3(){
//有模板提供了一定的默认实现,子类可以根据具体情况进行覆写。
}
public abstract void mathodOptional4();//由子类实现
public abstract void mathodOptional5();//由子类实现
public abstract boolean isSupport(){
//根据具体要求设置,或者在子类中实现。
}
}
三、简单的购物流程
网上购物一般要经过浏览商品、选择商品、客服咨询、配送、结算(使用积分、优惠券)、支付方式(支付宝、微信、银行卡、货到付款等)、查看订单这一系列流程。本文以京东购物和天猫购物为例,通过生活经验,我们可以分析出浏览商品、选择商品、查看订单为二者相同的步骤。京东和天猫的配送方式不同、支付方式不同。结算中是否使用优惠券,购物中是否咨询客服,这些可以通过属性值来设定。由此可以写出主类:
abstract class Shopping{
private boolean isCallService=false;//默认不咨询客服
private boolean isUseCoupon=true;//默认使用优惠券
public void setIsUseCoupon(boolean isUseCoupon){
this.isUseCoupon=isUseCoupon;
}
public void setCallService(boolean isCallService){
this.isCallService=isCallService;
}
public final void shop(){
this.lookUpGoods();
this.selectGoods();
if(this.isCallService) {
this.consult();
}
this.dispatching();
if(this.isUseCoupon) {
this.balance();
}
this.payment();
this.viewOrder();
}
public final void lookUpGoods(){
System.out.println("1.浏览商品");
}
public final void selectGoods(){
System.out.println("2.选择商品");
}
public abstract void consult();//客服咨询
public abstract void dispatching();//配送
public abstract void balance();//结算
public abstract void payment();
public void viewOrder(){
System.out.println("7.查看订单");
}
}
以及天猫类和京东类:
class Tmao extends Shopping{
//客服咨询
public void consult(){
System.out.println("3.旺旺咨询");
}
//配送
public void dispatching(){
System.out.println("4.中通、圆通、百世汇通、申通、邮政配送");
}
//结算
public void balance(){
System.out.println("5.使用优惠券结算");
}
//支付
public void payment(){
System.out.println("6.余额宝、银行卡、花呗支付");
}
}
class JD extends Shopping{
//客服咨询
public void consult(){
System.out.println("3.京东客服(机器人)");
}
//配送
public void dispatching(){
System.out.println("4.京东配送、店家配送");
}
//结算
public void balance(){
System.out.println("5.使用优惠券、京豆");
}
//支付
public void payment(){
System.out.println("6.微信支付、银行卡支付、京东白条支付");
}
}
测试代码为:
public class Test{
public static void main(String[] args) {
Tmao t=new Tmao();
t.setIsUseCoupon(false);
t.setCallService(true);
t.shop();
System.out.println("-------------------------------");
Tmao t2=new Tmao();
t2.shop();//没有客服咨询,使用优惠券。
System.out.println("-------------------------------");
JD j=new JD();
j.shop();
}
}
最后的输出结果为: