工作中模板方法模式用法及其使用场景

简介: 工作中模板方法模式用法及其使用场景

前言

最近有个周边系统对接我们系统进行投保的需求,周边系统会将客户填写好的投保单资料推送到我们系统,我们出完单后将单号返回给他们。此次对接的保险险种有多个,每个数据都有需要特殊处理的地方,但是他们的流程是一样的,投保单校验、入库、提交审核、自动审核等,最大的区别在于不同的险类他们的风险信息不一样,所以需要我们特殊处理。

概述

根据上图业务逻辑,可以看到整个流程是一致的,而且有很多模块都是可以复用,如果后续还有其它特殊险类接入的话,那都要复制黏贴写一套,拓展性和后期维护成功较高。所以可以引入模板方法设计模式,抽象一个父类,将整个业务逻辑放到父类中,特殊处理模块交由子类进行实现,可以起到延时加载的作用。


6f5566ffe38a6dd3cf00473af1a3060.png

在上图中,抽象类中有一个业务方法入口,该方法调用了校验方法、数据特殊处理方法、数据入库方法、提交审核方法、自动核保方法;其中数据特殊处理是一个抽象方法,交由子类进行实现,其它方法都已完成业务逻辑编写。


子类继承了父类后,只需要编写数据特殊处理这个抽象方法即可,其它的业务逻辑都在父类写好了,而且流程也不需要你动。

测试用例

模板方法:

我们在这里定义一个模板类,定义了数据校验方法、数据特殊处理、数据入库、提交审核、自动审核,其中除了数据特殊处理方法为抽象方法外,其它方法都有其具体的业务实现,数据特殊处理方法留到子类,由不同的子类根据自身业务进行实现。

public abstract class BusinessTemplate {
    public String execute(String data){
        this.checker(data);
        this.previousHandle(data);
        this.proposalSave(data);
        this.submit(data);
        this.autoAudit(data);
        return "成功";
    }
    /**
     * 数据校验
     * @param data
     */
    public void checker(String data){
        System.out.println("数据校验");
    }
    /**
     * 数据特殊处理
     * @param data
     */
    public abstract void previousHandle(String data);
    /**
     * 数据入库
     * @param data
     */
    public void proposalSave(String data){
        System.out.println("数据入库");
    }
    /**
     * 提交审核
     * @param data
     */
    public void submit(String data){
        System.out.println("提交审核");
    }
    /**
     * 自动审核
     * @param data
     */
    public void autoAudit(String data){
        System.out.println("自动审核");
    }
}

子类实现

不同业务类型的子类实现不同的数据特殊处理逻辑,由于其它流程共用的,直接使用父类的方法即可。

public class AccidentBusiness extends BusinessTemplate {
    @Override
    public void previousHandle(String data) {
        System.out.println("意外险数据特殊处理");
    }
}
public class HealthBusiness extends BusinessTemplate {
    @Override
    public void previousHandle(String data) {
        System.out.println("健康险数据特殊处理");
    }
}

测试

    public static void main(String[] args) {
        AccidentBusiness accidentBusiness=new AccidentBusiness();
        accidentBusiness.execute("投保数据");
        System.out.println("-------------");
        HealthBusiness healthBusiness=new HealthBusiness();
        healthBusiness.execute("投保数据");
    }

f98353fdcac5af27fea370df3bae0a37_73e9ef1f249c4392b2e101cdde8654af.png

总结

模板方法使用于有相同逻辑流程上,一般还会配合其它的设计模式,如简单工厂模式将这些类维护起来,在抽象方法中加上责任链模式或者策略模式等等。如何使用还要根据我们的业务来定制化,需要大概预判后续可能发生的场景。



目录
相关文章
|
人工智能 物联网 开发者
让你拥有专属且万能的AI摄影师+AI修图师——FaceChain迎来最大版本更新
自8月11日开源了第一版本证件照后,FaceChain迎来了最大版本的更新,不仅集中上线了一波非常有用的功能,在gradio界面上也做了大幅度优化
|
SQL 关系型数据库 MySQL
一次性导入千万级数据到Mysql(附源码)
MySql数据迁移、导入,在我们日常开发中,可以说是经常碰到。如果数据量比较小,一般都没什么问题,但是如果是涉及到千万级、亿级的数据量大数据量迁移,这里面就涉及到一个问题:如何快速导入千万数据到MySQL。 下面我们通过对比3种方法,来谈谈MySQL怎么高性能插入千万级的数据。
2680 0
|
应用服务中间件 nginx
nginx开发(二)配置mp4文件在线播放
1: 第一步先开打nginx的文件夹遍历功能   vi /usr/local/nginx/conf/nginx.conf #编辑配置文件,在http {下面添加以下内容: autoindex on; #开启nginx目录浏览功能 autoindex_exact_size off; #文件大小...
3694 0
|
12月前
|
自然语言处理 Kubernetes 异构计算
推理降本与提升资源效率的实践
本课程从业务角度探讨大模型推理部署及资源利用率提升。首先分析大模型与GPU发展趋势,包括模型开源、规模增长及多模态能力增强;其次介绍高效部署大模型推理业务的步骤,涵盖业务场景选择、架构优化及显存规划;接着讲解如何通过DeepCPU-LLM框架和DeepNCCL通讯库优化推理效率;最后探讨通过KuberGPU实现细粒度GPU资源管理,提升整体资源利用率,降低推理成本。
|
SQL 缓存 关系型数据库
揭秘MySQL一条SQL语句的执行流程
以上步骤共同构成了MySQL处理SQL语句的完整流程,理解这一流程有助于更有效地使用MySQL数据库,优化查询性能,及时解决可能出现的性能瓶颈问题。
322 7
|
XML 开发工具 Android开发
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
1065 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
|
调度 数据库 计算机视觉
并行和并发的区别(详细)
并行和并发的区别(详细)
|
安全 Linux 数据安全/隐私保护
Linux 文件、目录和用户权限管理指南
Linux 文件、目录和用户权限管理指南
747 0
|
SQL 关系型数据库 MySQL
MySQL中视图是什么?它有什么作用?
视图为虚拟的表,并不包含数据。视图只包含使用时动态检索数据的查询,返回的数据是从其他表中检索出来的。
409 1
|
定位技术