提升代码重用性:模板设计模式在实际项目中的应用

news2025/5/24 23:24:40

在软件开发中,我们经常面临着相似的问题,需要使用相同的解决方法。当我们希望将这种通用的解决方法抽象出来,并在不同的情境中重复使用时,就可以使用设计模式中的模板模式(Template Pattern)。模板模式是一种行为型模式,它定义了一个抽象类或接口,其中包含了一个算法框架,而具体的实现细节则由子类来完成。

模板模式的结构

模板模式由以下几个组成部分:

  • 抽象类(Abstract Class):抽象类定义了一个模板方法,该方法包含了一个算法的框架,而具体的实现细节则由子类来完成。抽象类可能还包含其他的公共方法和钩子方法,用于被子类调用或覆盖。
  • 具体类(Concrete Class):具体类是抽象类的子类,负责实现抽象类中的抽象方法。每个具体类都可以根据自身的需求来实现这些方法,从而完成算法的具体步骤。

模板模式的工作原理

模板模式基于"封装变化"的原则,通过将不变的算法框架放在抽象类中,将可变的实现细节留给具体类来实现。这样一来,我们可以在不改变整体结构的情况下,更容易地扩展和修改算法的部分细节。

当使用模板模式时,通常会按照以下步骤进行:

  1. 定义一个抽象类,并在其中定义一个模板方法,该方法包含了算法框架的基本流程。
  2. 在抽象类中定义一个或多个抽象方法,用于被子类实现。这些抽象方法代表了算法中可变的部分。
  3. 创建具体类,继承自抽象类,并实现其中的抽象方法。每个具体类可以根据自身的需求来实现这些方法,从而完成算法的具体步骤。
  4. 在客户端代码中,通过调用抽象类的模板方法来触发算法的执行。

模板模式的应用场景

模板模式在许多不同的应用场景中都有广泛的应用。下面列举一些常见的应用场景:

  1. 算法骨架:当多个类拥有相同的算法框架,只有部分步骤有所不同时,可以使用模板模式将这些不同的部分抽象出来。例如,在游戏开发中,不同种类的敌人可能有不同的行为模式,但它们都共享相同的攻击和移动逻辑。通过使用模板模式,可以将共享的逻辑放在基类中,而将特定的行为留给子类实现。
  2. 生命周期钩子:当希望控制算法执行顺序,并在某些步骤上留下扩展点时,可以使用模板模式。例如,在软件开发中,我们可能需要定义一个对象的创建或销毁过程,并允许子类在适当的时候插入自己的逻辑。模板模式可以提供这种灵活性,同时保持整体算法的一致性。
  3. 框架设计:模板模式在框架设计中也非常有用。框架通常定义了一系列的抽象方法或接口,供开发者根据自己的需求来实现。框架本身会提供一个算法框架,其中包含了一些公共的处理逻辑。开发者可以通过继承框架中的抽象类或接口,并实现其中的方法来定制自己的功能。
  4. 流程控制:模板模式也可用于流程控制方面。例如,在工作流系统中,每个步骤都有固定的执行顺序,并且可能涉及到一些共享的处理逻辑。通过使用模板模式,可以定义一个基本的流程,然后针对不同的步骤实现具体的行为。
  5. 数据库操作:在数据库相关的操作中,常常需要进行连接、查询和关闭等步骤。这些步骤可以被抽象出来作为模板方法,而具体的查询和处理细节则由子类来实现。

以订单处理的流程控制为例

// 抽象类
abstract class OrderProcessor {
    public void processOrder() {
        if (validateOrder()) {
            prepareOrder();
            if (shouldNotifyCustomer()) {
                notifyCustomer();
            }
            shipOrder();
        } else {
            handleInvalidOrder();
        }
    }

    protected abstract boolean validateOrder();
    protected abstract void prepareOrder();
    protected abstract void notifyCustomer();
    protected abstract void shipOrder();
    
    // 钩子方法
    protected boolean shouldNotifyCustomer() {
        return true;
    }
    
    protected void handleInvalidOrder() {
        System.out.println("Invalid order, unable to process.");
    }
}

// 具体类实现订单处理流程
class OnlineOrderProcessor extends OrderProcessor {
    private String orderNumber;

    public OnlineOrderProcessor(String orderNumber) {
        this.orderNumber = orderNumber;
    }

    @Override
    protected boolean validateOrder() {
        System.out.println("Validating online order: " + orderNumber);
        // 实际的验证逻辑
        return true;
    }

    @Override
    protected void prepareOrder() {
        System.out.println("Preparing online order: " + orderNumber);
        // 实际的准备逻辑
    }

    @Override
    protected void notifyCustomer() {
        System.out.println("Notifying customer about online order: " + orderNumber);
        // 实际的通知逻辑
    }

    @Override
    protected void shipOrder() {
        System.out.println("Shipping online order: " + orderNumber);
        // 实际的发货逻辑
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        OrderProcessor orderProcessor = new OnlineOrderProcessor("12345");
        orderProcessor.processOrder();
    }
}

在上述示例代码中,抽象类 OrderProcessor 定义了一个处理订单的模板方法 processOrder(),并包含了一系列的具体步骤。具体类 OnlineOrderProcessor 继承自抽象类,并实现了其中的抽象方法,根据具体需求实现了验证、准备、通知和发货的逻辑。客户端代码创建了一个具体的订单处理器并调用 processOrder() 方法来触发订单处理流程。

不同的实现类具有相同的模板方法,但是具体实现可以根据实际需求进行定制,既保证了模板方法的重用,又具备了灵活性。

运行以上代码将输出以下内容:

Validating online order: 12345
Preparing online order: 12345
Notifying customer about online order: 12345
Shipping online order: 12345

总结

模板模式是一种通过封装算法框架和提供可变的实现细节,来实现代码重用的设计模式。它能够简化代码的编写和维护,并且使得系统更易于扩展和修改。通过合理地使用模板模式,我们可以将通用的解决方法抽象出来,提高开发效率,减少重复代码的出现。

善用工具

成功的前端工程师很会善用工具,这些年低代码概念开始流行,像国外的 Mendix,国内的 JNPF,这种新型的开发方式,图形化的拖拉拽配置界面,并兼容了自定义的组件、代码扩展,确实在 B 端后台管理类网站建设中很大程度上的提升了效率。

开源地址:JNPF体验中心

代码量少,系统的稳定性和易调整性都会得到一定的保障。基于代码生成器,可一站式开发多端使用 Web、Android、IOS、微信小程序。代码自动生成后可以下载本地,进行二次开发,有效提高整体开发效率。同时,支持多种云环境部署、本地部署给予最大的安全保障,可以快速搭建适合自身应用场景的产品。

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

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

相关文章

PBA.客户需求分析 需求管理

一、客户需求分析 1 需求的三个层次: Requirement/Wants/Pains 大部分人认为,产品满足不了客户需要,是因为客户告知的需求是错误的,这听起来有一些道理,却没有任何意义。不同角色对于需求的理解是不一样的。在客户的需求和厂家的…

Idea集成Docker

1、前言 上一节中,我们介绍了Dockerfile的方式构建自己的镜像。但是在实际开发过程中,一般都会和开发工具直接集成,如Idea。今天就介绍下idea和Docker如何集成。 2、开启docker远程 要集成之前,需要我们本机能够访问docker服务…

系统架构师备考倒计时24天(每日知识点)

模块独立性的度量 聚合:衡量模块内部各元素结合的紧密程度偶然聚合:模块完成的动作之间没有任何关系,或者仅仅是一种非常松散的关系。逻辑聚合:模块内部的各个组成在逻辑上具有相似的处理动作,但功能用途上彼此无关。…

Spring framework Day10:JSR330注入注解

前言 JSR330是Java社区标准化进程(Java Community Process,简称JCP)中的一个规范,全名为"Dependency Injection for Java",即Java的依赖注入规范。它定义了一组注解和相关的规范,用于实现依赖注…

Prometheus:优秀和强大的监控报警工具

文章目录 概述Prometheus的底层技术和原理数据模型数据采集数据存储查询语言数据可视化 Prometheus的部署Prometheus的使用配置数据采集目标查询监控数据设置警报规则 查看数据可视化总结 概述 Prometheus是一款开源的监控和警报工具,用于收集和存储系统和应用程序…

NodeMCU清除Wifi信息

问题:NodeMCU连上一个Wifi后无法再连接到其他Wifi 解决方法:先清除Wifi信息 wifi.setmode(wifi.NULLMODE) wifi.sta.clearconfig()

Java学生管理系统(纯练手)

Java学生管理系统(纯练手) 该系统主要功能如下: ​添加学生:通过键盘录入学生信息,添加到集合中删除学生:通过键盘录入要删除学生的学号,将该学生对象从集合中删除修改学生:通过键…

《3D 数学基础》几何检测-最近点

目录 1. 直线上的最近点 2. 射线上的最近点 3. 点到平面的距离 4. 圆或球上的最近点 5. AABB上的最近点 1. 直线上的最近点 q是距离q的最近点,也就是q在直线上的投影。 其中p是直线上的点(向量表示),n是直线的法向量&#x…

基于行波理论的输电线路防雷保护

摘要 随着科技的发展,电力已成为最重要的资源之一,如何保证电力的供应对于国民经济发展和人民生活水平的提高都有非常重要的意义。输电线路的防雷保护就是重点之一。架空输电线路分布很广,地处旷野,易遗受雷击,线路的雷…

企业全域风控管理的最优解

后疫情时代,市场竞争加剧,呈现白热化状态,同时伴随企业的业务拓展、经营管理领域逐渐增多,企业面临的内外部风险、问题也呈指数增长趋势。 因此,企业在面临内外风险的双重压力下: 如何确保企业经营管理战…

【问题解决:配置】解决spring mvc项目 get请求 获取中文字符串参数 乱码

get类型请求的发送过程 前端发送一个get请求的过程: 封装参数进行URL编码,也就是将中文编码成一个带有百分号的字符串,具体可以在这个网站进行测试。http://www.esjson.com/urlEncode.html 进行Http编码,这里浏览器或者postman都…

【力扣1704】判断字符串的两半是否相似

👑专栏内容:力扣刷题⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、题目描述二、题目分析 一、题目描述 题目链接:判断字符串的两半是否相似 给你一个偶数长度的字符串 s 。…

判断两个二叉树是否相等

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//两个都为空if(pNULL&&qNULL){return true;}//有一个为空if(pNULL||qNULL){return false;}//两个不为空,但值不相同if(p->val!q->val){return false;}//值相同return isSameTree(p->le…

微信小程序个人账号申请和配置详细教程

一、注册小程序管理账号 1、注册方法 在微信公众平台官网首页(mp.weixin.qq.com),点击右上角的“立即注册”按钮。 2、选择注册的账号类型 选择“小程序”,点击“查看类型区别”可查看不同类型账号的区别和优势。 3、填写邮箱和…

如何利用 J2L3x 实现团队化作业

在当今快节奏的团队工作环境中,始终有一项问题不断困扰着许多企业,那就是团队成员之间的协同工作。这个问题越来越凸显出来,并在某种程度上影响了团队的效率和生产力。然而,随着科技的不断发展,有许多新的工具和平台可…

【学习笔记】Spring Security 01 认识Spring Security的重要特征(Features)

Spring Security 零、概述 Spring Security(简称SS)是一个高可用的、可自定义的身份认证和鉴权控制的框架。 类似的框架还有Shiro。 需求场景: 现今流行的web开发中,安全的第一位。 原本的鉴权开发流程:springweb自…

堆专题3 删除堆顶元素

题目: 样例: 输入 6 3 2 6 5 8 7 输出 7 5 6 3 2 思路: 堆顶的删除,就是取 或者 覆盖掉 h[1],其中覆盖掉 h[1] 的操作,用向下调整操作堆即可,向下调整的过程相对简单,只需要将堆尾…

如何提高团队协作效率?看完这篇就懂了(附工具)

在竞争激烈的现代工作环境中,团队协作被认为是成功的关键之一。团队协作能够提高效率,增强创造力,并帮助团队成员达成共同目标。无论是在大公司还是小企业中,团队协作都是不可或缺的。在这篇文章中,我们将分享如何通过…

提高测试用例覆盖全面性 5大技巧

测试用例覆盖率越高,有助于尽早发现潜在的问题和Bug,从而保障了软件的质量和稳定性。而测试用例覆盖率可以帮助测试团队评估测试的全面性,发现测试用例的盲点和不足之处,从而提高测试的效率,帮助测试团队优化测试资源的…

OpenCV4(C++)—— 图像连通域的详细分析

文章目录 前言一、connectedComponents函数二、connectedComponentsWithStats函数 前言 图像连通域,其实就是图像分割的一种方法。它通过检测像素之间的连接关系和相似性来划分图像中的区域,以便进行后续处理。图像邻域和图像邻域分析就不介绍了&#x…