《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()就是模板方法中的模板(遵循了模板方法模式的原则)。
相关推荐
Da Da 泓26 分钟前
多线程(七)【线程池】
java·开发语言·线程池·多线程
To Be Clean Coder35 分钟前
【Spring源码】getBean源码实战(三)
java·mysql·spring
Wokoo71 小时前
开发者AI大模型学习与接入指南
java·人工智能·学习·架构
电摇小人1 小时前
我的“C++之旅”(博客之星主题作文)
java·开发语言
资生算法程序员_畅想家_剑魔1 小时前
Java常见技术分享-23-多线程安全-总结
java·开发语言
萧曵 丶2 小时前
ArrayList 和 HashMap 自动扩容机制详解
java·开发语言·面试
这是程序猿2 小时前
基于java的ssm框架学生作业管理系统
java·开发语言·spring boot·spring·学生作业管理系统
千百元2 小时前
限制网段访问服务器端口63790
java·网络·mybatis
宋情写2 小时前
JavaAI03-数据来源
java
钦拆大仁2 小时前
JDK17新特性
java