23种设计模式之模板方法模式(模板模式)

23种设计模式之模板方法模式(模板模式)

文章目录

  • 23种设计模式之模板方法模式(模板模式)
    • 设计思想
    • 模板方法的优缺点
    • 模板方法模式的缺点
    • 代码解析
    • 小结

设计思想

原文:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
以上原文,我们可以抠出几个关键字

  • 算法的骨架
  • 些许步骤延迟到子类
  • 算法结构不可变
  • 重定义特定步骤

以上四点是我个人觉得比较重要的点,我们先模拟去上班的场景,早上需要去上班那么肯定是有这几个选项的
①:洗脸刷牙
②:出行交通工具的选择
③:选择上班路线
以上三点就是我们的去上班需要干的事,我们可以将这三件事当成算法的骨架,随后我们可以将第②和第③这两个步骤延迟到子类(将实现交给子类)。看到关键字三,算法结构不可变,其实也就是说整个去上班的步骤顺序不可变化,关键字四重定义特定步骤,思考一下起床洗脸刷牙基本固定(不要抬杠)只有步骤②和③是多变的,有可能你选择坐公交但是每一辆公交路线是不一致的,所以我们可以将这些步骤交给子类是实现。

模板方法的优缺点

模板方法模式的优点

  • 算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改。
  • 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
  • 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。
  • 提供了一个基本框架,容易扩展子类。模板方法有框架控制如何做事情,而由使用框架的人指定框架算法中每个步骤的细节。子 类只要继承父类,实现抽象方法,就可以使用父类的算法。

模板方法模式的缺点

  • 类数目的增加:每一个抽象类都需要一个子类来实现,这样导致类的个数增加。
  • 类数量的增加导致系统实现的复杂度提高。
  • 继承关系的缺点:如果父类添加新的抽象方法,所有子类都要改一遍。
    模板方法模式的实际应用
    在实际的开发中,有一些常用的框架和库使用了模板方法(Template Method)设计模式,以下是其中的几个例子:

Servlet:Servlet 是 JavaEE 中常用的 Web 开发框架,它使用了模板方法设计模式来处理 HTTP 请求和响应。在 Servlet 中,抽象类 HttpServlet 定义了模板方法 service(),子类需要继承 HttpServlet 并重写 service() 方法来处理具体的请求和生成响应。

Spring Framework:Spring 是一个广泛使用的应用程序开发框架,其中的一些子框架也使用了模板方法设计模式。比如,在 Spring Web MVC 框架中,HandlerInterceptor 接口定义了多个模板方法,如 preHandle()、postHandle() 和 afterCompletion(),用于处理请求拦截和后置处理等操作。

Hibernate 框架:Hibernate 是一个用于对象关系映射(ORM)的框架,它使用了模板方法设计模式来定义数据库访问的基本骨架。比如,在 Hibernate 中,Session 是一个抽象类,它定义了一系列的模板方法,如 save()、update() 和 delete(),用于执行数据库操作。

Android 开发中的 Activity 和 Fragment:在 Android 开发中,Activity 和 Fragment 是常用的组件,它们在生命周期管理和用户交互等方面使用了模板方法设计模式。比如,在 Activity 中,onCreate()、onStart() 和 onDestroy() 等方法作为模板方法,开发人员可以重写这些方法来提供自己的业务逻辑。

代码解析

在这里插入图片描述

//抽象类
public abstract class Work {
    /**
     * 定义模板方法
     */
    public final void goToWork(String name) {
        System.out.println(name + "起床了");
        System.out.println(name + "叠被子了");
        System.out.println(name + "刷牙了");
        System.out.println(name + "洗脸了");
        System.out.println(name + "开始选择座驾");
        this.rideVehicle();
        System.out.println("以选择以下行驶路线");
        this.selectPath();

    }

    /**
     * 乘坐交通工具
     */
    abstract void rideVehicle();

    /**
     * 选择路线
     */
    abstract void selectPath();
}

/员工A
public class StaffA extends Work {
    void rideVehicle() {
        System.out.println("乘坐五菱宏光");
    }

    void selectPath() {
        System.out.println("无拥堵情况,却距离较远");
    }


}



//员工B
public class StaffB extends Work {
    void rideVehicle() {
        System.out.println("乘坐劳斯莱斯幻影");
    }

    void selectPath() {
        System.out.println("拥堵却距离较近的路线");
    }
}
public class Test {
    public static void main(String[] args) {
        StaffA staffA = new StaffA();
        staffA.goToWork("王思葱");

    }
}

在这里插入图片描述

public class Test {
    public static void main(String[] args) {
        StaffB staffB = new StaffB();
        staffB.goToWork("王思冲");

    }
}

在这里插入图片描述

小结

分别运行StaffA以及StaffB这两个类我们可以看到整个的步骤顺序是没有变的,只有交通工具以及路线发生了变化,个人认为代码已经诠释了模板模式的精髓,我们平时出现多个类似的功能功能点比如解析DOC文件或者XLSX等不同的文件,前期一些初始化的操作可以封装到模板方法中,到了具体解析哪一种类型的文件,再去交给子类实现。我们可以自己去想一些场景,通过编码增强自己对该模式的理解。
模板模式相对比较简单一些吧,希望能够领悟到我列举的四个关键词条,早日使用到实际项目中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络基础(五):网络层协议介绍

目录 一、网络层 1、网络层的概念 2、网络层功能 3、IP数据包格式 二、ICMP协议 1、ICMP的作用和功能 2、ping命令的使用 2.1ping命令的通用格式 2.2ping命令的常用参数 2.3TypeCode:查看不同功能的ICMP报文 2.4ping出现问题 3、Tracert 4、冲突域 5、…

2024年骨传导蓝牙耳机排行榜前十,骨传导耳机品牌排行榜推荐

2024年骨传导蓝牙耳机排行榜前十,骨传导耳机品牌排行榜推荐 随着科技的飞速发展,骨传导蓝牙耳机已经成为了市场上备受欢迎的音频设备。这种神奇的耳机通过骨头传递声音,让你在享受音乐的同时,还能听到周围的环境,为你…

【触想智能】工业显示器的日常维护及分类知识分享

工业显示器不同于普通商业显示器,它的结构比较复杂,如果在使用的过程中出现产品故障,我们怎么处理呢?今天小编为大家介绍工业显示器日常维护以及分类方面的知识,希望对大家有所帮助。 1、 工业显示器整机无电。这其实是一个非常简…

class077 区间dp-下【算法】

class077 区间dp-下【算法】 算法讲解077【必备】区间dp-下 code1 括号区间匹配 // 完成配对需要的最少字符数量 // 给定一个由’[‘、’]‘、’(‘,’)‘组成的字符串 // 请问最少插入多少个括号就能使这个字符串的所有括号正确配对 // 例如当前串是 “([[])”&a…

python——第十七天

方法重写(overwrite) 、方法覆盖(override ):在继承的基础上,子类继承了父类的方法,如果不能满足自己使用,我们就可以重写或覆盖该方法 函数重载(overload): 在强数据类型的编程语言中(如Java、C、C等等): 函数名称…

C语言常用字符串

目录 1.什么是字符串 2.如何定义字符串 第3和第4定义的区别:3是字符串变量,4是字符串常量,不予许被修改 3.strlen和sizeof的区别 4.地址分配(malloc,realloc,free,memset) 案例 5.字符串拷贝(strcpy,strncpy) …

【每日一题】【12.11】1631.最小体力消耗路径

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 1631. 最小体力消耗路径https://leetcode.cn/problems/path-with-minimum-effort/这道题目的核心思路是:使用了二分查找和BFS &a…

【NR技术】NR NG-RAN整体架构 -网络接口以及无线协议框架(四)

1 引言 本博文介绍NR NG-RAN的网络节点间的接口以及无线协议框架。网络接口介绍包括RAN和NGC之间的NG接口;无线协议框架包括用户面和控制面协议。 2 NG接口 2.1 NG用户面接口 NG-U (user plane interface)是NG-RAN节点与UPF之间的接口。NG接口的用户平面协议栈如图…

1688以图搜图调用商品详情的API接口功能实现【附详细代码教程】

背景 在1688有个功能,就是上传图片,就可以找到类似的商品。如下 网址 :https://www.1688.com/ 这时候,我们可以使用程序来代替,大批量的完成图片上传功能。 实现思路 1、找到图片上传接口 post请求,for…

禾匠榜店商城系统 RCE漏洞复现

0x01 产品简介 禾匠榜店商城系统是浙江禾匠信息科技有限公司的一套基于PHP和MySQL的商城系统。 0x02 漏洞概述 禾匠榜店商城系统的api/testOrderSubmit模块下的preview方法存在命令执行漏洞,攻击者可以向服务器写入木马文件,直接获取服务器权限 0x03 漏洞概述 FOFA:bod…

【qt】Qt+OpenCv读取带有中文路径的图片

【opencv4.5.1版本】下载exe解压即可。。。https://opencv.org/releases/page/2/ 【qt5.15.2】 pro文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to …

2.Feign使用、上下文隔离及源码阅读

目录 概述使用配置pom.xmlfeign 接口编写controller 测试降级处理pom.xmlapplication.yml代码 Feign如何初始化及调用源码阅读初始化调用 feign的上下文隔离机制源码 结束 概述 阅读此文,可以知晓 feign 使用、上下文隔离及源码阅读。源码涉及两方面:fe…

elk:filebeat

elk:filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具,所使用的系统资源比logstash部署和启动时使用的资源要小的多。 filebeat可以运行在非java环境,他可以代替logstash在非java环境上收集日志。 filebeat无法实现数据的过滤…

先进的Web3.0实战热门领域NFT项目几个总结分享

非同质化代币(NFT)的崛起为游戏开发者提供了全新的机会,将游戏内物品和资产转化为真正的可拥有和交易的数字资产。本文将介绍几个基于最先进的Web3.0技术实践的NFT游戏项目,并分享一些相关代码。 Axie Infinity(亚龙无…

linux搭建seata并使用

搭建seata 官网 在linux下搭建 下载1.6.1版本:地址 新建文件夹、上传压缩包并解压 [roothao ~]# cd /usr/local/software/ [roothao /usr/local/software]# ls canal docker elk gitlab jdk mysql nacos nexus nginx rabbitmq redis redis_sentinel…

Jemeter,提取响应体中的数据:正则表达式、Json提取器

一、正则表达式 1、线程组--创建线程组; 2、线程组--添加--取样器--HTTP请求; 3、Http请求--添加--后置处理器--正则表达式提取器; 4、线程组--添加--监听器--查看结果树; 5、线程组--添加--取样器--调试取样器。 响应体数据…

ICC2:low power与pg strategy(pg_mesh)

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 用pg_strategy创建power stripe,示例如下: set pd_list {{DEFAULT_VA VDD_DIG VDD_DIG VSS} {PD_DSP VDD_DIG VDD_DSP VSS} } ;#两个电源域,DEFAULT_VA和PD_DSP是对应voltage area名字,其中D…

做数据分析为何要学统计学(6)——什么问题适合使用t检验?

t检验&#xff08;Students t test&#xff09;&#xff0c;主要依靠总体正态分布的小样本&#xff08;例如n < 30&#xff09;对总体均值水平进行差异性判断。 t检验要求样本不能超过两组&#xff0c;且每组样本总体服从正态分布&#xff08;对于三组以上样本的&#xff0…

2023/12/10总结

学习 WebSocket 一共四种方法&#xff0c;传递数据是要通过JSON格式传递 前端 onopen 在连接时 onmessage 收到消息时 通常携带参数 event &#xff0c;event.data 是消息 onerror 发生错误时 onclose 关闭连接时 发送消息 需要安装 vue-native-websocket 包 pnpm i vue-n…

数学建模算法

算法部分 1. 评价类模型2. TOPSIS3. 线性规划4. 聚类分析5. 预测模型6. 拉伊达准则(对异常值进行剔除)7. 数据拟合8. 图论代码练习1. 模拟圆周率2. 斐波那契数列3. 四只鸭子落在一个圆中概率4. 方程2: y" uy y,初值y(0) 1,y(0) 0 算法讲解 matlab代码大全 1. 评价类模型…