《HeadFirst设计模式(第二版)》第八章代码——模板方法模式

代码文件目录:
CaffeineBeverage
java 复制代码
package Chapter8_TemplateMethodPattern;

/**
 * @Author 竹心
 * @Date 2023/8/17
 **/

public abstract class CaffeineBeverage {
    final void prepareRecipe(){
        boilWater();
        brew();
        pourInCup();

        //这里使用钩子customerWantsCondiments()来让子类在算法过程中介入
        if(customerWantsCondiments()){
            addCondiments();
        }
    }

    abstract void brew();//冲泡
    abstract void addCondiments();//添加配料

    void boilWater(){
        //如果不想子类更改这些方法的实现,可以使用final
        System.out.println("Boiling Water!");
    }

    void pourInCup(){
        System.out.println("Pouring into cup");
    }

    //添加挂钩
    boolean customerWantsCondiments(){
        return true;
    }
}
Coffee
java 复制代码
package Chapter8_TemplateMethodPattern;

/**
 * @Author 竹心
 * @Date 2023/8/17
 **/

public class Coffee extends CaffeineBeverage{

    public void brew() {
        System.out.println("Dripping Coffee through filter!");
    }

    public void addCondiments(){
        System.out.println("Adding Sugar and Milk!");
    }

    public boolean customerWantsCondiments(){
        //这里实行相关代码决定客户是否需要添加配料
        return true;
    }
}
Tea
java 复制代码
package Chapter8_TemplateMethodPattern;

/**
 * @Author 竹心
 * @Date 2023/8/17
 **/

public class Tea extends CaffeineBeverage{
     public void brew(){
         System.out.println("Steeping the tea!");
     }

     public void addCondiments(){
         System.out.println("Adding Lemon!");
     }

     public boolean customerWantsCondiments(){
         //这里实行相关代码决定客户是否需要添加配料
         return true;
     }
}
notes
java 复制代码
模板方法模式

案例:
    咖啡和茶这两种饮料的制作方法如下:
    1.把水煮沸
    2.把咖啡粉末(茶叶)加入水中
    3.把咖啡(茶)倒进杯子
    4.添加配料(柠檬、糖、奶等)

    其中只有第2、4步是有所不同的(但也仅仅是涉及的对象不同),所以将四个步骤
    抽取出来作为父类CaffeineBeverage中的方法,然后在父类中实现1、3两个步骤,
    而2、4则由其子类(Tea, Coffee)来实现

模板方法:定义一个算法步骤,允许子类提供一个或者多个步骤的实现。

优点:
1.提高代码复用
2.可以在不改变算法结构的情况下,重新定义算法中的某些步骤,可维护性好(用案例来说,
  就是如果要添加新的饮料,可以直接继承该父类,实现其独特的原料配方即可)

好莱坞原则:
    高层组件主动决定控制底层组件,但是底层组件绝对不能调用高层组件。
    模板方法模式(还有工厂模式、观察者模式)采用了这一原则

模板方法模式的应用:
    常用的Arrays.sort()方法就涉及到模板方法模式,sort()可以对所有的对象数组
    进行排序,前提是该数组的对象类型实行了接口Comparable下的compareTo()
    方法。这里的sort()就是模板方法中的模板(遵循了模板方法模式的原则)。
相关推荐
sg_knight5 小时前
设计模式实战:命令模式(Command)
python·设计模式·命令模式
一 乐6 小时前
电影院|基于springboot + vue电影院购票管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·电影院购票管理管理系统
恼书:-(空寄6 小时前
JVM GC 日志分析 + 常见 GC 场景 + 实战参数调优
java·jvm
消失的旧时光-19436 小时前
Spring Boot 实战(五):接口工程化升级(统一返回 + 异常处理 + 错误码体系 + 异常流转机制)
java·spring boot·后端·解耦
杨凯凡8 小时前
【012】图与最短路径:了解即可
java·数据结构
比特森林探险记8 小时前
【无标题】
java·前端
椰猫子8 小时前
Javaweb(Filter、Listener、AJAX、JSON)
java·开发语言
朝新_8 小时前
【Spring AI 】核心知识体系梳理:从入门到实战
java·人工智能·spring
一 乐8 小时前
旅游|基于springboot + vue旅游信息推荐系统(源码+数据库+文档)
java·vue.js·spring boot·论文·旅游·毕设·旅游信息推荐系统
我命由我123459 小时前
Android 开发中,关于 Gradle 的 distributionUrl 的一些问题
android·java·java-ee·android studio·android jetpack·android-studio·android runtime