首页 > 其他分享 >模板方法模式

模板方法模式

时间:2022-12-07 19:33:13浏览次数:41  
标签:黄豆 方法 void System 模式 println 配料 模板 out

豆浆制作问题

 

模板方法模式基本介绍

模板方法模式原理类图

 

 

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

 

 

 

 

 

代码演示

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

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

 

标签:黄豆,方法,void,System,模式,println,配料,模板,out
From: https://www.cnblogs.com/dongyaotou/p/16964306.html

相关文章

  • JUC6 中断机制与线程通信三种让线程等待和唤醒的方法:
    1.线程中断1.1什么是线程中断①.一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop、Thread.suspend、Thread.resume都已经被废......
  • 创建者模式
    建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。分离了部件的构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂......
  • 记录--微信小程序获取用户信息的最新方法记录
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助微信小程序获取用户信息的几种方式以下三种方式都无法获取到用户的openID1.开放组件获取用户信息<open-......
  • Pycharm cannot set up a python SDK问题解决方法
    xcrun:error:invalidactivedeveloperpath(/Library/Developer/CommandLineTools),missingxcrun...解决方法:打开终端输入xcode-select--install回车后,系统......
  • Mybatis-Plus中updateById方法不能更新空值问题
    问题描述在Mybatis-Plus中调用updateById方法进行数据更新默认情况下是不能更新空值字段的。而在实际开发过程中,往往会遇到需要将字段值更新为空值的情况。那么如果让Mybat......
  • 为什么 egui 用立即模式?
    https://github.com/emilk/egui#why-immediate-mode 为什么立即模式egui是立即模式GUI库,与保留模式GUI库相对。保留模式和立即模式之间的区别最好用按钮的例子来说......
  • vue data中的字符串用'和`包含有什么区别?模板字符串
    vuedata中的字符串用'和`包含有什么区别?字段代码我验证过可以正常的执行,但是我不清楚这个``(ESC下面的那个键)在这里和单引号有什么区别,请教大佬们作者:李李链接:https......
  • 01.单例设计模式
    单例设计模式​ 所谓单例设计模式,就是采取一定的方法在保证整个软件系统当中,对某个类只能存在一个对象实例,并且该类只提供了一个取得其对象实例的方法单例设计模式有八种......
  • Linux查看进程运行的完整路径方法
    通过ps及top命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息,如绝对路径等。这时,我们需要通过以下的方法来查看进程的详细信息:Linux在启动一个进程时,系统会在/p......
  • 转载:GB9706.1-2020安规三项之漏电流测试方法
     GB9706.1-2020相关测试用例文章标签:  测试工具:医用漏电流测试仪CS2675FX-1注:S1按钮为正常和单一故障模式切换;S5按钮为换相模式切换测试对象:对地漏电流、接触电流(......