模板设计之简单的购物流程

一、模板设计的概念

在生活中,制作不同的饮料虽然具体的实现过程不同,但是它们的大体流程都是一样的,都要经过烧水、把水倒入杯子里、主料放入杯子中、辅料放入杯子中等一系列流程。不同的饮料差别在于放的主料和辅料不同和是否烧水。因此在主类中,我们可以定义这一系列流程,以及它们共有方法的实现(如烧水、把水放到杯子里)。流程中的非共有的部分,可以定义为抽象方法,由子类具体实现。同时,还可以设置是否烧水这一属性,从而决定流程中是否要烧水。而在子类中,可以具体定义实现各自不同的部分。这一系列流程就是模板方法,显而易见,模板方法中定义了一套执行的逻辑顺序(算法)。

模板方法模式在书中的定义为:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。这里的一个方法就是主类中的模板方法,延迟到子类中的步骤就是主类中的抽象方法,子类各自不同的部分。

二、模板设计模式的代码形式

//主类
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();
    }
}

最后的输出结果为:

猜你喜欢

转载自blog.csdn.net/smell201611010513/article/details/86505419