详解模板模式

news2024/11/18 15:29:09

目录

1.概述

2.实际业务场景示例

2.1.需求和实现思路

2.1.完整代码实现


1.概述

模板模式是一种常用的设计模式,它定义了一个操作中的算法的骨架,将某些步骤延迟到子类中实现。模板模式使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。

模板模式中有两个角色:

  • 抽象类(Abstract Class):定义模板方法,描述算法的骨架,包含了一系列的步骤,并且有一些步骤是抽象方法,需要由子类实现。

  • 实现类(Concrete Class):抽象类的具体实现,实现了抽象方法,完成了算法中的具体步骤。

下面是模板模式的典型实现步骤。

抽象类:

public abstract class AbstractClass {
    public final void templateMethod() {
        // 执行算法的骨架
        step1();
        step2();
        step3();
    }

    public abstract void step1();

    public abstract void step2();

    public abstract void step3();

    // 具体方法
    public void concreteMethod() {
        // 具体方法的实现
    }
}

实现类:

public class ConcreteClass extends AbstractClass {
    @Override
    public void step1() {
        // 实现步骤1
    }

    @Override
    public void step2() {
        // 实现步骤2
    }

    @Override
    public void step3() {
        // 实现步骤3
    }
}

使用:

public class Client {
    public static void main(String[] args) {
        AbstractClass template = new ConcreteClass();
        template.templateMethod();
    }
}

2.实际业务场景示例

2.1.需求和实现思路

博主以前做过一个场景,以问卷的方式对一个小区的物业服务进行评价,产品上提供的默认实现是将问卷发给业主来进行评价,但产品推广到某个市的时候,该市有定制化需求,问卷不发给业主而是发给上级管理部门,由上级管理部门去巡视,整理两边的流程如下:

产品上的实现:

  • 解析保存问卷

  • 将问卷分发给业主

  • 保存任务

项目上的定制化需求:

  • 解析保存问卷

  • 将问卷分发到管理部门的角色上

  • 保存任务

这时候就可以用到模板模式。

抽象类:

public abstract class TaskServiceBase {
    //创建任务
    public void createTask(){
        savePaper();
        allocationPaper();
        savePaper();
    }

    //保存问卷
    private void savePaper(){
        //业务逻辑
    }
    //分发问卷的逻辑
    public abstract void allocationPaper();
    //保存任务
    private void saveTask(){
        //业务逻辑
    }
}

针对客户的定制化实现:

public class ProjectTastService extends TaskServiceBase{
    public void allocationPaper() {
        //分发给住户
    }
}

产品的通用实现:

public class ProductTaskService extends TaskServiceBase{
    public void allocationPaper() {
        //分发给管理部门
    }
}

2.1.完整代码实现

产品给出的默认实现,使用@Configuration+@Bean的方式进行注入,配合使用@ConditionalOnMissBean来判断是否已经有实现已经注入Spring的IOC,有的话就不注入产品的默认实现:

 项目代码中引入产品的依赖:

没有注入自定义的实现时,调用的会是产品上的默认实现:

编写针对客户的定制化实现,用@Service注解将实现注入Spring 的IOC中

生效的会是给客户定制的实现:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ubuntu】vscode上jupter notebook的使用

1.安装vscode 2.安装python环境和插件 系统要有Python环境:conda install python 或者 pip都可以 在vsode里安装如下插件 3.安装jupter conda install jupyter notebook 安装完之后试着打开 输入jupyter note 打开才行,如果安装失败,就…

【IoT】降低硬件创业风险的 6 个小建议

目录 第一个是聘用多名独立的工程师 第二个是从小批量开始做 第三个是使用电子模块 第四个是充分利用制造商资源 第五个是在构建产品之前先建立客户群体 第六个是预售你的产品 无论你提前做了多么充分的准备。 将全新的硬件产品推向市场就一定会引入风险。 这里的全新是…

AntDB 企业增强特性介绍——读写分离

面对日益增加的系统访问量,读写分离可以充分利用备机资源,有效地提升数据库的吞吐量。过去常用的手段是通过应用层来控制数据库的读写流量。 AntDB 通过在 Coordinator 组件的 SQL 解析路由层增加对读写流量的精确访问控制且对应用透明,做到…

CMU-Multimodal SDK Version 1.2.0(mmsdk)Windows配置与使用+pytorch代码demo

最近做实验要用到CMU-MOSI数据集,网上搜到的教程很少,经过一天时间的探索,最终成功安装配置数据集,这篇文章完整地整理一下该数据集的下载与使用方法。 配置环境: window10,anaconda 1. 需要下载的内容 …

DVWA-15.Open HTTP Redirect

OWASP将其定义为: 当 Web 应用程序接受不受信任的输入时,可能会导致 Web 应用程序将请求重定向到不受信任输入中包含的 URL,则可能会出现未经验证的重定向和转发。通过修改恶意站点的不受信任的 URL 输入,攻击者可以成功发起网络钓…

NeRF 模型评价指标PSNR,MS-SSIM, LPIPS 详解和python实现

PSNR: PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)是一种常用于衡量图像或视频质量的指标。它用于比较原始图像与经过处理或压缩后的图像之间的差异。PSNR通过计算原始图像与重建图像之间的均方误差(Mean Squared E…

python爬各平台评论并数据分析——数据采集、评论情绪分析、新闻热度

一、爬取数据 小问题汇总 1.python之matplotlib使用系统字体 用于解决python绘图中,中文字体显示问题 2.cookie与视频页面id(b站、微博等)查看 F12打开网页开发者模式,然后F5刷新,进入控制台中的网络,…

618什么值得囤?这些刚需数码好物必囤!

​目前,618活动已经正式拉开帷幕了,相信很多小伙伴已经按耐不住想要入手了!但如果目前还没什么头绪,不知道买什么的话,现在就不妨来抄一下作业吧!近期我整理了一份618数码好物清单,都是精心挑选…

插件化工程R文件瘦身技术方案 | 京东云技术团队

随着业务的发展及版本迭代,客户端工程中不断增加新的业务逻辑、引入新的资源,随之而来的问题就是安装包体积变大,前期各个业务模块通过无用资源删减、大图压缩或转上云、AB实验业务逻辑下线或其他手段在降低包体积上取得了一定的成果。 在瘦…

Window域控环境之账号误删恢复

文章目录 背景信息问题分析操作步骤 文章内容已做脱敏处理 背景信息 8:30,收到联络反馈客户误删除部门领导域控账户,希望紧急实施VM整机恢复工作。收到联络时,我是觉得这个事情挺严重的。毕竟现在域控账号是企业里面重要的身份与…

深度学习数据处理中,标量、向量、张量的区别与联系

计算机中的标量机是指只是一个数一个数地进行计算的加工处理方法,区别于向量机能够对一批数据同时进行加工处理。标量机比向量机的运算速度慢,因此,向量机更适合于演算数据量多的大型科学、工程计算问题。 计算机可以进行数值计算&#xff0c…

5.2.11 IP分组的转发(二)IP分组转发算法

5.2.11 IP分组的转发(二)IP分组转发算法 我们前面已经了解了路由器的结构以及直接交付和间接交付的概念,明白了路由器会根据路由协议生成路由表再根据路由表生成转发表,当路由器收到一个待转发的IP分组以后,会根据分组…

Background-1 基础知识 sqli-Labs Less1-Less-4

文章目录 一、Less-1二、Less-2三、Less-3四、Less-4总结 一、Less-1 http://sqli:8080/Less-1/?id1在第一关我们可以尝试增加一个单引号进行尝试 http://sqli:8080/Less-1/?id1错误显示如下: near 1 LIMIT 0,1 at line 1推测语法的结构 select *from where **…

2009年iMac装64位windows7

单位领导会花屏的iMac(24寸 2009年初版)我捡来用,应该大约是在2020年安装了32位windows7,发现不安装显卡驱动便不会花屏死机,于是就当简单的上网机用着,毕竟iMac的显示屏还是蛮不错的。现在要使用的1个软件…

linux中那些常用好玩的命令

前言 大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第66篇文章,今天要分享是多个命令,在工作中不常用,但好玩。 专栏地址:[linux基本功-基础命令专栏] &#xff0c…

华为OD机试真题B卷 Java 实现【二叉树的所有路径】,附详细解题思路

一、题目描述 给定一个二叉树,返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 二、思路与算法 最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。 如果当前节点不是…

DAY 77 [ Ceph ] 基本概念、原理及架构

前言 在实现容器化的初期,计划使用 Ceph 作为容器的存储。都说存储是虚拟化之母,相对容器来说,存储也起到了至关重要的作用。 选用 Ceph 作为容器化存储理由如下: 方便后期横向扩展;Ceph能够同时支持快存储、对象存…

MM32F3273G8P火龙果开发板MindSDK开发教程15 - 获取msa311加速器的方向改变事件

MM32F3273G8P火龙果开发板MindSDK开发教程15 - 获取msa311加速器的方向改变事件 1、功能描述 类似手机里横屏竖屏检测,当方向发生变化时,横屏竖屏自动切换。 当msa311方向改变时,会产生中断,然后从寄存器Reg 0x0C(Orientation _…

图解LeetCode——20. 有效的括号

一、题目 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类…

i.MX RT1010跨界MCU调试利器(FreeMASTER上手体验)

FreeMASTER是一款基于PC的免费工具,用于可视化和调试嵌入式实时应用程序。它可以帮助开发人员快速实现深入嵌入式系统的数据测试和调试,它为嵌入式系统设计师提供了一个强大的、可视化的调试环境,在调试、验证和追踪实时应用程序时尤其有用。…