模板方法模式-java实战

news/2024/11/20 18:45:28/文章来源:https://www.cnblogs.com/fun-seeker/p/18558786

经典实现

模板方法模式(Template Method Pattern)是一种行为型设计模式,它在父类中定义了一个算法的框架,允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。

  • 实现步骤:

    • 定义抽象类:这个类定义了算法的框架,包括模板方法和一些抽象方法。

      • 实现模板方法:模板方法定义了算法的骨架,它调用抽象方法,调用具体方法。

      • 定义抽象方法:这些方法由子类实现,它们代表了算法的某些步骤。

      • 定义钩子方法:一个空方法,子类可以通过这个钩子,控制父类执行逻辑

    • 实现具体子类:子类实现抽象类中的抽象方法、钩子方法,从而完成算法的特定步骤。

  • 代码示例(Java):

     // 抽象类
    public abstract class Coffee {// 模板方法public final void prepareRecipe() {//煮水boilWater();//酿造brew();//倒入杯中pourInCup();//加入调味品if(needCondiments()){addCondiments();}}// 抽象方法,由子类实现abstract void brew();// 抽象方法,由子类实现abstract void addCondiments();//钩子方法boolean needCondiments(){return false;}// 具体方法void boilWater() {System.out.println("Boiling water");}void pourInCup() {System.out.println("Pouring into cup");}}// 具体实现子类
    public class CoffeeWithNothing extends Coffee {@Overridevoid brew() {System.out.println("Steeping tea");}@Overridevoid addCondiments() {}}public class CoffeeWithMilk extends Coffee {@Overridevoid brew() {System.out.println("Dripping coffee through filter");}@Overridevoid addCondiments() {System.out.println("Adding sugar and milk");}@Overrideboolean needCondiments(){return true;}}// 客户端代码public class Main {public static void main(String[] args) {Coffee tea = new Tea();tea.prepareRecipe();Coffee coffee = new CoffeeWithMilk();coffee.prepareRecipe();}}

Spring框架实现

是模板方法模式和回调模式的结合,不需要继承的另一种实现方式。

  • 实现步骤:

    • 实现模板方法:定义算法的骨架,它调用回调方法

    • 定义回调接口:定义回调方法。

    • 实现回调接口的具体类:实现回调方法,控制具体执行逻辑。

  • 代码示例(Java):

    阅读源码JdbcTemplate、RedisTemplate等源码中的execute方法。

    //模板方法所属类
    public class Coffee {public <T> T process(CondimentsCallback<T> condimentsCallback){//煮水boilWater();//酿造brew();//倒入杯中pourInCup();return condimentsCallback.addCondiments();}// 具体方法void boilWater() {System.out.println("Boiling water");}void brew() {System.out.println("Steeping tea");}void pourInCup() {System.out.println("Pouring into cup");}//示例调用方法public void processWithNothing(){process(new CoffeeWithNothing());}public int processWithMilk(){return process(new CoffeeWithMilk());}}//回调接口
    public interface CondimentsCallback <T>{T addCondiments();
    }//具体实现
    public class CoffeeWithNothing implements CondimentsCallback<Object> {@Overridepublic Object addCondiments() {System.out.println("Nothing Adding");return null;}
    }public class CoffeeWithMilk implements CondimentsCallback<Integer>{@Overridepublic Integer addCondiments() {System.out.println("Adding sugar and milk");return 0;}
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/837465.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高级程序语言设计第八个个人作业

2024高级语言程序设计:https://edu.cnblogs.com/campus/fzu/2024C 高级语言程序设计课程第五次作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13304 学号:102400231 姓名:袁志华 作业 第11章 12367第12章 12389

人工智能之机器学习基础——贝叶斯(Bayesian Methods)

贝叶斯分类器 贝叶斯分类器是一类基于贝叶斯定理的统计学习方法,广泛应用于分类问题。其核心思想是通过计算后验概率 P(y∣x),将输入样本 x 分类到具有最大后验概率的类别。 1. 贝叶斯定理 贝叶斯定理是概率论中的基本法则,用于描述条件概率的关系: 其中:P(y∣x):在已知…

2024.11.20 NOIP模拟 - 模拟赛记录

异或(xor) 每次所加三角形的范围如图所示:这道题做法较多,我是通过两组差分与前缀和来做的。 首先需要一个三角形差分,使每一次在差分数组中修改时,影响到的范围是一个三角形,比如这样(红色点为 \((x,y)\),即 \((r,c)\)):假设我们真正需要修改的三角形是橙色部分:那…

实时多模态 AI 的 N 种新可能丨实时互动和大模型专场@RTE2024回顾

在本届 RTE2024 大会上,来自产业界和学术界的多位专家深入探讨了实时互动和大模型技术的最新进展及其潜在应用。西湖心辰联合创始人俞佳、声网 AI 算法工程师乔齐、MiniMax 资深音频算法专家张博闻、商汤科技数字文娱解决方案负责人焦文奎以及面壁智能算法 VP 翟忠武等分享了他…

vscode主题美化

vscode 主题美化 主题使用Tokyo Night由于我在用rust的时候发现其对一些变量的颜色不太好看,所以自己又在设置中改了一点"editor.tokenColorCustomizations": {...."[Tokyo Night]": { // or "[Tokyo Night Storm]""textMateRules": […

2024.11.20总结

1本文于 github 博客同步更新。 A: 一个数可以被操作当且仅存在一列的顶部元素为它且存在一列的底部元素为它,初始扫一遍,将合法的元素以顶部所在列为关键字扔到小根堆里,每次找到最小的元素添加,然后检查将新露出来的元素是否存在匹配,若结束时未填完即为无解。 B: 要么…

ABAP 日期计算

RP_CALC_DATE_IN_INTERVAL 日期函数2 FIMA_DATE_CREATE 有问题 在2月份计算有问题 慎用 计算两个日期月份 FIMA_DAYS_AND_MONTHS_AND_YEARS

群晖NAS维修数据恢复

一台群晖NAS,开机状态灯是黄灯,DISC4也是亮黄灯,机器一直在报警。 群辉型号DS415+,是一种典型的硬盘损坏的情况,这是一台四盘位的一个群辉NAS,第一时间把每个硬盘取下来编个编号,WD的红盘也就是nasVR专用硬盘,型号是WD401F2X的,生产日期有三块是2015年,有一块是比较新…

实景三维技术在基层社会治理中的数智化应用

在推进国家治理体系和治理能力现代化的进程中,基层社会治理的数字化转型尤为关键。实景三维技术,以其直观、精准的空间信息表达能力,正在成为基层社会治理的有力工具。本文将探讨实景三维技术如何在“地、房、人、用、管”五个维度赋能基层社会治理。一、实景三维技术简介实…

Nginx服务器配置---反向代理服务时proxy_pass的转发规则

nginx是由俄罗斯开发的一款http web服务器,我们经常用这款服务器做负载均衡和反向代理。今天我们就来聊聊Nginx作为反向代理时,如何进行路由配置。假设你已经部署好Nginx了,我们进入Nginx安装目录,进入nginx.conf文件。找到http节点下的server节点,值是一个json。在json中…