尚硅谷设计模式学习——模板模式

尚硅谷设计模式学习——模板模式_第1张图片

尚硅谷设计模式学习——模板模式_第2张图片

尚硅谷设计模式学习——模板模式_第3张图片

尚硅谷设计模式学习——模板模式_第4张图片

//抽象类 表示豆浆
abstract class SoyaMilk{
    //模板方法, make,模板方法可以做成final,不让子类去覆盖
    final void make(){
        select();
        addConiments();
        soak();
        beat();
    }
    //选材料
    void select(){
        System.out.println("第一步:选择好的新鲜黄豆 ");
    }
    //添加不同的配料,抽象方法,子类具体实现
    abstract void addConiments();
    //浸泡
    void soak(){
        System.out.println("第三步:黄豆和配料开始浸泡,需要3个小时");
    }
    void beat(){
        System.out.println("第四步:黄豆和配料放到豆浆机打碎");
    }
}

class RedBeanSoyaMilk extends SoyaMilk{

    @Override
    void addConiments() {
        System.out.println("加入红豆");
    }
}

class PeanutSoyMilk extends SoyaMilk{

    @Override
    void addConiments() {
        System.out.println("加入花生");
    }
}
public class Template {
    public static void main(String[] args){
        System.out.println("--制作红豆豆浆--");
        SoyaMilk redBeanSoyMilk = new RedBeanSoyaMilk();
        redBeanSoyMilk.make();
        System.out.println("--制作花生豆浆--");
        SoyaMilk peanutSoyMilk = new PeanutSoyMilk();
        peanutSoyMilk.make();
    }
}

模板方法模式的钩子方法:

尚硅谷设计模式学习——模板模式_第5张图片

代码实现:

/*
模板方法模式
 */
abstract class SoyaMilk{

    //模板方法,make,模板方法可以做成final,不让子类去覆盖
    final void make(){
        select();
        if(customerWantCondiments()){
            addCondiments();
        }
        soak();
        beat();
    }

    //选材料
    void select(){
        System.out.println("第一步选择新鲜的黄豆");
    }

    //添加不同的配料,抽象方法
    abstract void addCondiments();

    //浸泡
    void soak(){
        System.out.println("第三步 黄豆和配料开始浸泡");
    }

    //
    void beat(){
        System.out.println("第四步 黄豆和配料放到豆浆机去打碎");
    }

    //钩子方法,决定是否需要添加配料
    Boolean customerWantCondiments(){
        return true;
    }
}

class RedBeanSoyaMilk extends SoyaMilk{

    @Override
    void addCondiments() {
        System.out.println("加入上好的红豆");
    }
}

class PeanutSoyaMilk extends SoyaMilk{

    @Override
    void addCondiments() {
        System.out.println("加入上好的花生");
    }
}

class PureSoyaMilk extends SoyaMilk{

    @Override
    void addCondiments() {
    }

    //钩子方法,决定是否需要添加配料
    Boolean customerWantCondiments(){
        return false;
    }
}

public class TestTemplate {

    public static void main(String[] args) {
        //制作红豆豆浆
        System.out.println("制作红豆豆浆");
        SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
        redBeanSoyaMilk.make();
        //制作花生豆浆
        System.out.println("制作花生豆浆");
        SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
        peanutSoyaMilk.customerWantCondiments();
        peanutSoyaMilk.make();
        //制作纯豆浆
        System.out.println("制作纯豆浆");
        SoyaMilk pureMilk = new PureSoyaMilk();
        pureMilk.customerWantCondiments();
        pureMilk.make();
    }
}

小结:模板模式在抽象类确定了基本流程,并将子类相同的功能实现,子类中不同实现的功能使用抽象方法,在子类中各自实现,这样的好处是代码很清晰。

你可能感兴趣的:(设计模式)