当前位置: 首页 > news >正文

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

代码文件目录:

 

CaffeineBeverage
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(){//如果不想子类更改这些方法的实现,可以使用finalSystem.out.println("Boiling Water!");}void pourInCup(){System.out.println("Pouring into cup");}//添加挂钩boolean customerWantsCondiments(){return true;}
}
Coffee
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
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
模板方法模式案例:咖啡和茶这两种饮料的制作方法如下:1.把水煮沸2.把咖啡粉末(茶叶)加入水中3.把咖啡(茶)倒进杯子4.添加配料(柠檬、糖、奶等)其中只有第2、4步是有所不同的(但也仅仅是涉及的对象不同),所以将四个步骤抽取出来作为父类CaffeineBeverage中的方法,然后在父类中实现1、3两个步骤,而2、4则由其子类(Tea, Coffee)来实现模板方法:定义一个算法步骤,允许子类提供一个或者多个步骤的实现。优点:
1.提高代码复用
2.可以在不改变算法结构的情况下,重新定义算法中的某些步骤,可维护性好(用案例来说,就是如果要添加新的饮料,可以直接继承该父类,实现其独特的原料配方即可)好莱坞原则:高层组件主动决定控制底层组件,但是底层组件绝对不能调用高层组件。模板方法模式(还有工厂模式、观察者模式)采用了这一原则模板方法模式的应用:常用的Arrays.sort()方法就涉及到模板方法模式,sort()可以对所有的对象数组进行排序,前提是该数组的对象类型实行了接口Comparable下的compareTo()方法。这里的sort()就是模板方法中的模板(遵循了模板方法模式的原则)。

http://www.lryc.cn/news/135661.html

相关文章:

  • RESTful API,以及如何使用它构建 web 应用程序
  • Git+Gitee使用分享
  • 【3D激光SLAM】LOAM源代码解析--transformMaintenance.cpp
  • DiscuzQ 二开教程(7)——二次开发版本部署文档
  • u盘数据丢失但占内存如何恢复?不要着急,这里有拯救方案
  • springboot日志文件名称为什么叫logback-spring.xml
  • Mysql 开窗函数(窗口函数)
  • 计算机视觉之图像特征提取
  • 【面试经典150题】移除元素·JavaScript版
  • Cesium 相机的三种放置方式
  • 看了我这篇帖子,你还会觉得制作电子杂志很难吗?
  • SRE 与开发的自动化协同 -- 生产环境出现 bug 自动生成异常追踪
  • 【简单认识Docker基本管理】
  • 设备管理系统是什么?的修设备管理系统有什么功能?
  • Docker安装并配置Pushgateway
  • 汽车OTA活动高质量发展的“常”与“新”
  • C++信息学奥赛1121:计算矩阵边缘元素之和
  • Android Selector 的使用
  • k8s集群中service的域名解析、pod的域名解析
  • Shell 编程快速入门 之 数学计算和函数基础
  • 学习php中如何获取pdf文件中的文本内容
  • 分布式数据库架构:高可用、高性能的数据存储
  • Python工具箱系列(四十)
  • 【Hibench 】完成 HDP-Spark 性能测试
  • 【C++奇遇记】内存模型
  • Debootstrap 教程
  • MySQL之InnoDB引擎
  • API自动化管理: 从繁琐到轻松
  • Databend 开源周报第 107 期
  • 计算机网络参考模型