《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()就是模板方法中的模板(遵循了模板方法模式的原则)。
相关推荐
皮皮林5514 分钟前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河22 分钟前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程3 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅5 小时前
Java面向对象入门(类与对象,新手秒懂)
java
静水流深_沧海一粟5 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder6 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
初次攀爬者6 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺6 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart7 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot