Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式

article/2025/10/25 18:47:47

        Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式

一、概述

        模板设计模式: 父类定义通用抽象的功能方法,子类负责具体的实现。 本文将以一个通用的定时任务,处理模式,来讲解java 模板设计模式。

假设定时任务,要实现以下功能:

  1. 开关 --- 随时可以关闭
  2. 锁资源 --- 避免多实例重复执行
  3. 任务执行,时间记录
  4. 任务处理
  5. 资源释放

        大致的代码如下:


import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.commons.lang3.time.StopWatch;
import org.springframework.scheduling.annotation.Scheduled;/*** Description: 通用任务处理* @author wu* @version 1.0* @date 2023/3/26 21:16*/
@Slf4j
public class GeneralTaskTest {/*** 分布式锁 , 默认: true*/private boolean lock = true;/*** 启用 定时任务标记 , 默认: true*/private boolean enable = true;@Scheduled(cron = "0/10 * * * * ?")public void task(){// 1、任务开关// apollo 配置 / 数据库配置等if(!enable){log.info("任务没有打开");return;}// 获取锁 --- redis , zk 等// 2、分布式锁 --- 避免多实例执行if(!lock){log.info("该实例,没有获取到锁");return;}// 3、执行逻辑log.info("开始执行~ ");final StopWatch stopWatch = StopWatch.createStarted();try {System.out.println(" 执行定时任务处理逻辑~");// 测试异常// int i = 1/0;}catch (Exception e){// 4、异常处理log.error("task execute failure , {}", ExceptionUtils.getStackTrace(e));}finally {// 5、资源关闭// 释放锁资源stopWatch.stop();log.info("任务执行结束,耗时:{} ms",stopWatch.getTime());}}}

二、思路设计

        1、 创建 BaseTaskTemplate 类

        有2个属性, enbale 和lock ,分别标记 开关和锁 , 提供 getter / setter 方法,用于子类处理锁标记。

/*** 分布式锁 , 默认: true*/
private boolean lock = true;/*** 启用 定时任务标记 , 默认: true*/
private boolean enable = true;

        2、核心方法: taskExecute 任务执行类 如下

  • beforeExec : 前置处理,用于获取锁 , 开关字段处理
  • exec(): 业务逻辑处理
  • afterExec(): 资源释放 等
 public void taskExecute(){beforeExec();if(!lock || !enable){log.info(this.getClass().getName() + " , 没有获取到锁,或者定时任务没有开启 ~ lock={} , enable={}", lock, enable);return;}log.info(this.getClass().getName() +" {} ,任务开始执行 -- "+ new Date().getTime());final StopWatch stopWatch = StopWatch.createStarted();try {exec();} catch (Exception e) {log.error(this.getClass().getName() + ",定时任务执行出错, cause by : {}", ExceptionUtils.getStackTrace(e));
//            throw  e;  // throw e} finally {afterExec();stopWatch.stop();log.info("finally 程序执行结束,耗时:{} ms ", stopWatch.getTime());}log.info("任务执行结束~ over ...");}

三、代码实现

        1、BaseTaskTemplate ,通用任务模板,代码如下:


import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.commons.lang3.time.StopWatch;import java.util.Date;/*** Description: BaseTaskTemplate , 通用定时任务执行模板* @author w* @version 1.0* @date 2023/3/9 15:20* @remarks: 该任务迁移到 scheduler 分支* @see*/
@Slf4j
public class BaseTaskTemplate {/*** 分布式锁 , 默认: true*/private boolean lock = true;/*** 启用 定时任务标记 , 默认: true*/private boolean enable = true;public void taskExecute(){beforeExec();if(!lock || !enable){log.info(this.getClass().getName() + " , 没有获取到锁,或者定时任务没有开启 ~ lock={} , enable={}", lock, enable);return;}log.info(this.getClass().getName() +" {} ,任务开始执行 -- "+ new Date().getTime());final StopWatch stopWatch = StopWatch.createStarted();try {exec();} catch (Exception e) {log.error(this.getClass().getName() + ",定时任务执行出错, cause by : {}", ExceptionUtils.getStackTrace(e));
//            throw  e;  // throw e} finally {afterExec();stopWatch.stop();log.info("finally 程序执行结束,耗时:{} ms ", stopWatch.getTime());}log.info("任务执行结束~ over ...");}protected void afterExec() {}protected void beforeExec() {}protected void exec() throws Exception {}public boolean isLock() {return lock;}public void setLock(boolean lock) {this.lock = lock;}public boolean isEnable() {return enable;}public void setEnable(boolean enable) {this.enable = enable;}
}

        2、创建 UserTaskTemplate 类

        继承 BaseTaskTemplate 重写 exec 方法,写具体业务处理逻辑, 创建 task 方法, 配置对应的 定时策略,在方法体中使用 super.taskExecute(); 调用任务处理,完整代码如下


import com.runcode.springboottourist.template.BaseTaskTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;/*** Description: UserTaskTemplate* @author w* @version 1.0* @date 2023/3/10 14:41*/
@Slf4j
@Component
public class UserTaskTemplate extends BaseTaskTemplate {@Scheduled(cron = "0/10 * * * * ?")public void task (){log.info("UserTaskTemplate === ");super.taskExecute();}@Overrideprotected void exec() throws Exception {TimeUnit.SECONDS.sleep(1);log.info(" 执行定时任务逻辑处理 ~ ");}@Value("${UserTaskTemplate.enable:true}")@Overridepublic void setEnable(boolean enable) {super.setEnable(enable);}@Overrideprotected void beforeExec() {log.warn("beforeExec ===>>>");// 获取锁 --- redis.getLock}@Overrideprotected void afterExec() {log.warn("beforeExec  ===>>>");// 释放锁 --- redis.releaseLock}
}

        3、测试结果如下:

2023-03-26 21:38:30.002  INFO 119920 --- [uler pool===>>4] c.r.s.task.UserTaskTemplate              : UserTaskTemplate === 
2023-03-26 21:38:30.002  WARN 119920 --- [uler pool===>>4] c.r.s.task.UserTaskTemplate              : beforeExec ===>>>
2023-03-26 21:38:30.002  INFO 119920 --- [uler pool===>>4] c.r.s.template.BaseTaskTemplate          : com.runcode.springboottourist.task.UserTaskTemplate {} ,任务开始执行 -- 1679837910002
2023-03-26 21:38:31.014  INFO 119920 --- [uler pool===>>4] c.r.s.task.UserTaskTemplate              :  执行定时任务逻辑处理 ~ 
2023-03-26 21:38:31.014  WARN 119920 --- [uler pool===>>4] c.r.s.task.UserTaskTemplate              : afterExec  ===>>>
2023-03-26 21:38:31.014  INFO 119920 --- [uler pool===>>4] c.r.s.template.BaseTaskTemplate          : finally 程序执行结束,耗时:1011 ms 
2023-03-26 21:38:31.014  INFO 119920 --- [uler pool===>>4] c.r.s.template.BaseTaskTemplate          : 任务执行结束~ over ...

四、总结

        1、 若又有一个任务需要执行,直接继承 BaseTaskTemplate 类即可,重写 exec 方法;

  • 需要配置锁资源 , 重写 beforeExec 和 afterExec 方法 ;
  • 需要配置 开关 , 重写 setEnable 方法,加上 @Value 注解即可

        2、beforeExec 、afterExec 方法,是参考 线程池 ThreadPoolExecutor 的 实现, 如下:

参考资料:

Spring @Value 赋值

Java 设计模式 --- Builder模式 Java Builder 模式


http://chatgpt.dhexx.cn/article/wJYyjkrN.shtml

相关文章

设计模式——模板设计模式

一 前言 在面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现是会随着环境的变化而改变&…

java设计模式之模板方法设计模式

什么是模板方法设计模式 模板方法是基于继承实现的,在抽象父类中声明一个模板方法,并在模板方法中定义算法的执行步骤(即算法骨架)。在模板方法模式中,可以将子类共性的部分放在父类里实现,而特性部分在子类中实现,只需…

一文搞懂设计模式--模板模式

Hi,大家好。今年的天气实在是太热了,七月份的厦门晒得我觉得身上冒出了烤肉香,不知道各位是否安好,但是在再热的天气也不能阻止我们学习的热情(doge)。今天的主题是模板(Template Method&#x…

设计模式 – 模板设计模式

模板设计模式 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 该模式的主…

【设计模式】模板模式

博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。 本文首发于此 博主:威威喵 | 博客主页:https://blog.csdn.net/smile_running 这是23种设计模式中的模板模…

设计模式之模板模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、模板模式是什么? 模板模式是一种行为型的软件设计模式,在父类中定义了一个模板算法,只实现…

设计模式——模板模式

更多内容,前往 IT-BLOG 在面向对象程序设计过程中,程序员常常会遇到如下情况:设计一个系统时知道算法所需的关键步骤,且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体…

深入理解设计模式之模板模式

我们平时办理入职的流程是:填写入职登记表->打印简历->复印学历->复印身份证->签订劳动合同->建立花名册->办理工牌->安排工位。我平时在家里炒菜的流程是:洗锅->点火->热锅->上油->下原料->翻炒->放调料->出…

数据化风控与催收人员策略管理

在印象中催收也许是个玄学,一个做得好的催收员除了催收技巧外、你需要了解心理学、懂声音学、懂人性、懂风水易经,比如就有个认识的人对什么岁数的人在哪个时辰拨打电话才比较好,都有讲究…总之一切尽在不言中… 但催收的管理却与之相反&…

信贷产品年终总结之风控评分模型

叮咚,信贷年终总结的又一个专题来了,作为报告总结类的系列型文章,近期我们番茄知识星球平台陆续发布了相关年终总结专题,依次为客群特征画像、贷中行为分析、贷后逾期表现等,以上文章可详见之前陆续发布的内容。该业务…

实操信贷场景中的反欺诈模型

今天的文章,关于反欺诈模型的实操,之前有跟大家分享过相关内容,部分反欺诈的领域的童鞋感觉内容比较有帮助,今天就该内容进行讲解。本文介绍的产品适合在消费零售信贷及现金场景贷中的中短期产品,其中涉及的变量参考有…

信贷全生命周期监控报表开发

对于任何一家从事信贷业务的机构而言,监控报表的设计及搭建尤为重要。因为监控报表不仅涉及信贷风控的资产监控,更能反馈客群质量的变化、内部管理手段的调整、策略规则对客群质量的影响等方面。为此,番茄风控输出此系列文章,我们…

信贷全流程监控报表有哪些?

风险策略分析工作是风险管理的重要工作内容,其工作内容需要涉及风控领域中多个环节及细节内容,包含贷前策略调整、策略分析调优、贷中业务监控、贷后策略调整等模块内容,涉及相关模块工作细节及工作内容,我们将一一为大家梳理及分…

详解小微机构贷前准入规则

关注 “番茄风控大数据”,获取更多数据分析与风控大数据的实用干货 嗨同学们好,现在疫情的情况已经出现大反转,我们国内的疫情已经控制住,多个城市都出现了连续多年0增长,一二线城市的部分公共场合也陆续对外开放&…

催收评分卡是如何搭建的?

1、背景 在整个风控体系中,一般分为贷前、贷中和贷后,贷前一般包括反欺诈和A卡,贷中一般使用B卡,贷后一般使用C卡,随着现在监管的越来越严格,催收的合规性越来越重要,所以各持牌金融机构越来越…

贷款中介业务管理系统-具备完善的贷前审批及贷后监管功能

一、系统介绍 银行贷款中介平台(助保贷平台)是一套适用于当今时代的中介系统,对于借款人来说可以满足他们上学、培训、旅游、购物等。平台根据各借款人资质推介给各银行或用自有资金放款。贷款中介系统提供了一套完善的网络借贷系统&#xff…

一文带你了解助贷行业

原文作者:宁阿姨(知乎ID) 原文链接:https://zhuanlan.zhihu.com/p/485880345 注:仅限自己学习使用 日常消费用花呗用信用卡,个人周转用借呗或微粒贷,买车买房用车贷房贷,作为消费者…

贷后催收中的风险联动管控指标

在番茄风控大数据之前的文章中,之前跟大家介绍过催收相关内容:催收小词典,助你轻松讨回债务。 今天文章会再跟大家介绍在这些催收指标中,哪些指标是可以反馈到贷前贷中风控环节的。在策略整体优化流程而言,数据是流动…

现金贷、信用贷、消费贷小贷系统后台、现金贷、消费贷、信用贷、助学贷、旅游贷、装修贷、准入授信 、贷款申请、产品授信、合同管理、放款审批、放款登记、还款管理、贷后检查、贷后预警、贷款结项、Axure原型

现金贷、信用贷、消费贷小贷系统后台、现金贷、消费贷、信用贷、助学贷、旅游贷、装修贷、准入授信 、贷款申请、产品授信、合同管理、放款审批、放款登记、还款管理、贷后检查、贷后预警、贷款结项、 Axure原型演示及下载地址:Axure Cloud - Generating Project …

什么是银行测试业务?银行测试业务包括哪些?

我们知道软件测试是为了保证软件的质量和可靠性而在新软件系统上线之前对软件进行的质量检测工作。通过软件测试这个过程找出软件中的错误,分析错误的产生原因和容易产生错误的区域,进而有针对性的设计测试方法提高软件测试的效率。 以上简单讲述了一下…