模板方法模式

豆浆制作问题

 

模板方法模式基本介绍

模板方法模式原理类图

 

 

模板方法模式解决豆浆制作问题

 

 

 

 

 

代码演示

package com.sky.template;

/**
 * 抽象类 豆浆
 */
public abstract class SoyMilk {

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

    /** 以下的四个方法也可以用private进行修饰 */
    // 选材料
    void select(){
        System.out.println("第一步:选择好的新鲜的黄豆 ");
    }

    // 添加不同的配料,抽象方法,让具体的子类去实现
    abstract void addCondiments();

    // 浸泡
    void soak(){
        System.out.println("第三步:黄豆和配料开始浸泡,需要3个小时 ");
    }

    // 打磨
    void beat(){
        System.out.println("第四步:黄豆和配料放到豆浆机中进行打磨 ");
    }


}

package com.sky.template;

/**
 * 花生豆浆
 */
public class PeanutSoyMilk extends SoyMilk{


    /**
     * 添加配料
     */
    @Override
    void addCondiments() {
        System.out.println("添加上好的花生");
    }
}

package com.sky.template;

/**
 * 黑豆豆浆
 */
public class BlackBeanSoyMilk extends SoyMilk{
    @Override
    void addCondiments() {
        System.out.println("添加上好的黑豆 ");
    }
}

package com.sky.template;

/**
 * 客户端
 */
public class Client {

    public static void main(String[] args) {

        System.out.println("=====制作花生豆浆=====");
        SoyMilk peanutSoyMilk = new PeanutSoyMilk();
        peanutSoyMilk.make();

        System.out.println("=====制作黑豆豆浆=====");
        SoyMilk blackBeanSoyMilk = new BlackBeanSoyMilk();
        blackBeanSoyMilk.make();
    }
}

=====制作花生豆浆=====
第一步:选择好的新鲜的黄豆 
添加上好的花生
第三步:黄豆和配料开始浸泡,需要3个小时 
第四步:黄豆和配料放到豆浆机中进行打磨 
=====制作黑豆豆浆=====
第一步:选择好的新鲜的黄豆 
添加上好的黑豆 
第三步:黄豆和配料开始浸泡,需要3个小时 
第四步:黄豆和配料放到豆浆机中进行打磨 
View Code

模板方法模式的钩子方法

 

 

代码演示

package com.sky.template.improve;

/**
 * 抽象类 豆浆
 */
public abstract class SoyMilk {

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

    /** 以下的四个方法也可以用private进行修饰 */
    // 选材料
    void select(){
        System.out.println("第一步:选择好的新鲜的黄豆 ");
    }

    // 添加不同的配料,抽象方法,让具体的子类去实现
    abstract void addCondiments();

    // 浸泡
    void soak(){
        System.out.println("第三步:黄豆和配料开始浸泡,需要3个小时 ");
    }

    // 打磨
    void beat(){
        System.out.println("第四步:黄豆和配料放到豆浆机中进行打磨 ");
    }

    // 钩子方法  用户判断要不要加配料 TRUE:加 FALSE:不加
    boolean customerWantCondiments(){
        return true;
    }


}

package com.sky.template.improve;

/**
 * 黑豆豆浆
 */
public class BlackBeanSoyMilk extends SoyMilk {
    @Override
    void addCondiments() {
        System.out.println("添加上好的黑豆 ");
    }
}

package com.sky.template.improve;

/**
 * 花生豆浆
 */
public class PeanutSoyMilk extends SoyMilk {


    /**
     * 添加配料
     */
    @Override
    void addCondiments() {
        System.out.println("添加上好的花生");
    }
}

package com.sky.template.improve;

public class PureSoyaMilk extends SoyMilk{
    @Override
    void addCondiments() {
        //空实现 注:我们有时候也是能够看到在实际项目开发中也是有这样写的,使用的也是空实现
    }

    @Override
    boolean customerWantCondiments() {
        return false;
    }
}

package com.sky.template.improve;

/**
 * 客户端
 */
public class Client {

    public static void main(String[] args) {

        System.out.println("=====制作花生豆浆=====");
        SoyMilk peanutSoyMilk = new PeanutSoyMilk();
        peanutSoyMilk.make();

        System.out.println("=====制作黑豆豆浆=====");
        SoyMilk blackBeanSoyMilk = new BlackBeanSoyMilk();
        blackBeanSoyMilk.make();

        System.out.println("=====制作纯豆浆=====");
        SoyMilk pureSoyaMilk = new PureSoyaMilk();
        pureSoyaMilk.make();
    }
}

=====制作花生豆浆=====
第一步:选择好的新鲜的黄豆 
添加上好的花生
第三步:黄豆和配料开始浸泡,需要3个小时 
第四步:黄豆和配料放到豆浆机中进行打磨 
=====制作黑豆豆浆=====
第一步:选择好的新鲜的黄豆 
添加上好的黑豆 
第三步:黄豆和配料开始浸泡,需要3个小时 
第四步:黄豆和配料放到豆浆机中进行打磨 
=====制作纯豆浆=====
第一步:选择好的新鲜的黄豆 
第三步:黄豆和配料开始浸泡,需要3个小时 
第四步:黄豆和配料放到豆浆机中进行打磨 
View Code

模板方法模式的注意事项和细节

 

posted on 2022-12-07 19:22  ~码铃薯~  阅读(22)  评论(0编辑  收藏  举报

导航