Template Method模式

news2024/11/25 13:53:24

文章目录

  • 💡前言
    • 分类
    • 优点
  • 💡问题引入
  • 💡概念
  • 💡例子
  • 💡总结

💡前言

此文是第一篇讲解设计模式的文章,而笔者我又不想另起一篇来概述设计模式的分类,作用,以及优点,所以在此简单概述一下。

分类

根据GOF-23 模式分类

  • 从目的来看:
  1. 创建型模式将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。(主要用于描述如何创建对象
  2. 结构型模式通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。(主要用于描述如何实现类或对象的组合
  3. 行为型模式通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来的冲击。(主要用于描述类或对象怎么交互以及怎样分配职责

在这里插入图片描述

  • 从范围来看:
  1. 类模式处理类与子类的静态关系。
  2. 对象模式处理对象间的动态关系

还有一种分类角度:
在这里插入图片描述

优点

  • 能够实现可维护性复用的设计方案,提高设计与开发效率
  • 设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间的沟通以及交流,使得设计方案更加通俗易懂。因为设计模式跨语言,跨平台,跨应用,跨国界
  • 大部分设计模式都兼顾了系统的可重用性以及可扩展性,使得可以更好地重用一些已有的设计方案、功能模块以及一个完整的软件系统
  • 合理使用设计模式并对设计模式的使用情况进行文档化,将有助于别人更快地理解系统

💡问题引入

在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。

如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?

💡概念

定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。

——《设计模式》GoF

简单点说就是,找出稳定(不变)的功能将其在父类中实现,而将一些 不稳定(变化)的放入子类 中实现。

💡例子

class Library
{
public:

	void run()
	{
		// 模拟业务流程
		step1();
		step2();
		step3();
		step4();
		step5();
	}
	~Library() {}

protected:
	void step1() {}  // 稳定  
	void step3() {}  // 稳定
	void step5() {}  // 稳定
	virtual void step2() {}  // 变化
	virtual void step4() {}  // 变化
};

class Application : public Library
{
public:
	void step2() {}
	void step4() {}
};

int main()
{
	Library* lib = new Application();
	lib->run(); 

	delete lib;
	return 0;
}

上述的代码实例,就是子类来决定父类的执行;达到一种晚绑定

💡总结

  • 形式化算法:模板方法模式在父类中形式化地定义一个算法,而由子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序
  • 代码复用:模板方法模式是一种代码复用技术,提取公共行为并放在父类中,通过子类实现不同的行为
  • 实现反向控制:模板方法模式可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否执行
  • 增加子类方便:模板方法模式中可通过子类覆盖父类的基本方法,不同子类可以提供基本方法的不同实现,更换以及增加新的子类很方便

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

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

相关文章

MySQL笔记(四) 函数、变量、存储过程、游标、索引、存储引擎、数据库维护、指定字符集、锁机制

MySQL笔记(四) 文章目录 MySQL笔记(四)函数文本处理函数日期和时间处理函数数值处理函数类型转换函数流程控制函数自定义函数基本语法 局部变量全局变量聚集函数 aggregate functionDISTINCT 存储过程为什么要使用使用创建 删除建…

调用api实现ChatGPT接口余额查询

先打个广告: 推荐一款不用科学上网就可以使用的ChatGPT工具:智能聊天助手 体验版入口:智能聊天助手体验版 在ChatGPT官网可以查询接口使用额度,但是官方并没有提供相应的API给开发者调用。但是可以通过破解的方式找到它的API。方法…

人生在世皆有过错,来一起看看Java中的异常吧!!!

Java中的异常问题详解 一、异常的概念与分类 1.异常概念 概念:Java异常是一个描述在代码段中发生异常的对象,当发生异常情况时,一个代表该异常的对象被创建并且在导致该异常的方法中被抛出,而该方法可以选择自己处理异常或者传…

Invicti v23.5 for Windows 发布 - 企业应用安全测试

Invicti v23.5 for Windows - 企业应用安全测试 Invicti Standard 11 May 2023 v23.5.0.40516 请访问原文链接:https://sysin.org/blog/invicti/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Invicti 是一种自动…

[HFCTF2022]ezchain

环境分析 环境提供了docker-compose.yml,nginx.conf文件,从两个文件中可疑分析出是不出网的环境 nginx.conf: server { listen 80;server_name localhost;location / {root /usr/share/nginx/html; #收到/路径请求会访问/usr/sha…

Keil5----Debug时,watch1中全局变量数值不刷新问题解决方法

问题: 在Keil5-MDK中,Debug时,watch1中全局变量数值不刷新。 解决方法: 步骤1:进入Debug模式 将程序调试下载器(STlink,Jlink,Ulink)连接,编译程序后。 进行如下操作&#xff1a…

算法修炼之练气篇——练气十六层

博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的…

MySQL --- 多表查询

多表查询、事物、以及提升查询效率最有手段的索引 一. 多表查询 1.1 多表查询 --- 概述 1.1.1 数据准备 将资料中准备好的多表查询数据准备的SQL脚本导入数据库中。 部门表: 员工表: 1.1.2 介绍 多表查询:指从多张表中查询数据&#…

2023年的深度学习入门指南(13) - 写后端

2023年的深度学习入门指南(13) - 写后端 我们前面学习了用python在本机上写前端,也学习了使用HTML在本机写前端。同理,我们可以写Windows应用,mac应用,iOS应用,Android应用等等以适合各种终端。其实,最通用…

python+chrome rpc方式轻松绕过五秒盾(cloudflare)

Cloudflare 5秒盾是一种基于云技术的Web应用程序防火墙(WAF),旨在保护网站免受各种Web攻击,如SQL注入、跨站点脚本(XSS)和DDoS攻击。它能够在5秒内检测到并阻止恶意流量,并提供实时安全警报和日志记录。此外,它还提供了一系列安全功能,包括SSL / TLS加密、IP过滤、访问…

单链表你别再找我了,我怕双向链表误会

目录 带头双向循环链表的创建和初始化 创建一个新的结点(方便复用) 链表判空 链表打印 链表尾插 链表尾删 链表头插 链表头删 任意插入 任意删除 链表查找 链表销毁 完整代码 😎前言 之前我们讲了结构最简单,实现起来…

kettle win11 启动闪退 --启动日志

一、启动闪退 思路: 找原因找启动日志根据启动日志查看启动失败的原因 二、找启动日志 采用debug模式启动 查看控制台–根据控制台操作 看生成的启动日志文件 查看日志 DEBUG: Using PENTAHO_JAVA_HOME DEBUG: _PENTAHO_JAVA_HOMEE:\java8 DEBUG: _PENTAHO…

记一次靶场搭建与渗透测试

渗透目标 通过Windows7打入工作组环境,穿透两层内网拿到DC(域控制器)权限 环境搭建 环境搭建 网络拓扑 虚拟机网络配置 渗透测试 永恒之蓝外网打点 nmap -sS 192.168.2.0/24扫描外网存活主机,发现两台主机192.168.2.128和192…

芯片电源附近为什么放置的是0.1uF电容

日常使用情况 我们在电源滤波电路上可以看到各种各样的电容,100uF、10uF、100nF、10nF不同的容值,而在我们使用中常常会在芯片电源附近放置0.1uF电容,以TB67S109AFNG应用手册为例,其中推荐使用的也是0.1uF的电容 电容的特性 数字…

分享几款小白从零开始学习的会用到的工具/网站

大二狗接触编程也有两年了,差生文具多这大众都认可的一句话,在这里蹭一下这个活动分享一下从0开始学习编程有啥好用的工具 目录 伴侣一、Snipaste截图工具 伴侣二、Postman软件(可用ApiPost平替) 伴侣三、字体图标网站 伴侣四…

BlockChain-Account_TakeOver

题目描述 ECDSA 签名 假设我们的私钥为 d A d_A dA​而公钥为 Q A Q_A QA​, Q A d A ⋅ G Q_Ad_A\cdot G QA​dA​⋅G,接下来就是签名的过程,要签名的消息为 m m m 取 e H A S H ( m ) e HASH(m) eHASH(m)取 e e e的左边的 L n L_n L…

Baumer工业相机堡盟工业相机软件CameraExplorer常见功能使用说明二

Baumer工业相机堡盟工业相机软件CameraExplorer常见功能使用说明二 Baumer工业相机Baumer工业相机CE软件图像/视频存储功能Baumer工业相机CE软件记录日志文件功能Baumer工业相机CE软件查看图像Buffer及数据流统计信息 Baumer工业相机 Baumer工业相机堡盟相机是一种高性能、高质…

汇编五、伪指令与汇编程序结构

1、伪指令 1.1、概念 (1)伪指令是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有对应机器码,只用于汇编过程中为汇编程序提供汇编信息,帮助编译器编译。 1.2、ASM51提供的伪指令 伪指令分为如下几类。 1.2.1、…

zuul源码分析

zuul源码解析 zuul与springboot整合的依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency>看到starter第一反应就是springboot的自动装配? 我们去…

简历制作、投递、(实习)面试技巧!!

目录 1.为什么要找实习 2.什么时候找实习 3.制作简历 4.简历注意事项 5.IT后端的校招的要求 6.简历里面写什么&#xff1f; 7.简历模板的选择 8.个人信息 9.求职意向 10.专业技能 11.项目经验 12.其他注意事项 13.找工作的手段 14.找工作的态度 ​编辑 15.面试…