当前位置: 首页 > article >正文

Python 设计模式:模板模式

1. 什么是模板模式?

模板模式是一种行为设计模式,它定义了一个操作的算法的骨架,而将一些步骤延迟到子类中。模板模式允许子类在不改变算法结构的情况下,重新定义算法的某些特定步骤。

模板模式的核心思想是将算法的固定部分提取到一个基类中,而将可变部分留给子类实现。这样可以避免代码重复,提高代码的复用性和可维护性。

模板模式通常包含以下几个组成部分:

  • 抽象类(Abstract Class):定义模板方法和一些抽象方法。模板方法是算法的骨架,调用其他方法来完成具体的步骤。
  • 具体类(Concrete Class):实现抽象类中的抽象方法,提供具体的实现。

模板模式在软件设计中具有多种优点:

  • 代码复用:通过将算法的固定部分提取到基类中,减少了代码重复,提高了代码的复用性。
  • 灵活性:子类可以根据需要实现不同的步骤,而不需要修改算法的整体结构。
  • 易于维护:算法的固定部分集中在一个地方,便于管理和维护。
from abc import ABC, abstractmethod# 抽象类
class DataProcessor(ABC):def process_data(self):self.read_data()  # 读取数据self.clean_data()  # 清洗数据self.analyze_data()  # 分析数据self.save_results()  # 保存结果@abstractmethoddef read_data(self):pass@abstractmethoddef clean_data(self):pass@abstractmethoddef analyze_data(self):pass@abstractmethoddef save_results(self):pass# 具体类:处理 CSV 数据
class CSVDataProcessor(DataProcessor):def read_data(self):print("Reading data from CSV file.")def clean_data(self):print("Cleaning CSV data.")def analyze_data(self):print("Analyzing CSV data.")def save_results(self):print("Saving results to CSV file.")# 具体类:处理 JSON 数据
class JSONDataProcessor(DataProcessor):def read_data(self):print("Reading data from JSON file.")def clean_data(self):print("Cleaning JSON data.")def analyze_data(self):print("Analyzing JSON data.")def save_results(self):print("Saving results to JSON file.")# 客户端代码
if __name__ == "__main__":csv_processor = CSVDataProcessor()csv_processor.process_data()  # 处理 CSV 数据print("\n")json_processor = JSONDataProcessor()json_processor.process_data()  # 处理 JSON 数据
  1. 抽象类DataProcessor 类定义了模板方法 process_data,该方法调用了其他方法来完成数据处理的各个步骤。它还定义了一些抽象方法(read_dataclean_dataanalyze_datasave_results),这些方法将在子类中实现。

  2. 具体类

    • CSVDataProcessor 类实现了 DataProcessor 抽象类,提供了处理 CSV 数据的具体实现。
    • JSONDataProcessor 类同样实现了 DataProcessor 抽象类,提供了处理 JSON 数据的具体实现。
  3. 客户端代码

    • 在客户端代码中,创建 CSVDataProcessorJSONDataProcessor 的实例,并调用 process_data 方法来处理数据。
    • 每个具体类都实现了自己的数据处理逻辑,但它们都遵循了相同的处理流程。

2. 模板模式和继承机制的区别

2.1 模板模式的目的

模板模式的主要目的是定义一个算法的骨架,并将某些步骤的实现延迟到子类中。它强调的是算法的结构和步骤的固定性,同时允许子类在不改变算法整体结构的情况下,提供具体的实现。这种模式的使用场景通常是在多个类中有相似的操作流程,但具体的实现细节可能不同。

2.2 普通继承的特点

普通的继承机制允许子类继承父类的属性和方法。虽然子类可以重写父类的方法,但这种重写并不一定遵循特定的算法结构。普通继承更关注的是属性和行为的复用,而不一定是算法的步骤和流程。

2.3 模板模式的结构

在模板模式中,通常会有一个抽象类(模板类),它定义了一个模板方法,包含了算法的固定步骤。具体的实现则在子类中完成。模板方法通常是一个公开的方法,子类通过实现抽象方法来提供具体的行为。

class Template:def template_method(self):self.step_one()self.step_two()self.step_three()def step_one(self):pass  # 默认实现或抽象方法def step_two(self):pass  # 默认实现或抽象方法def step_three(self):pass  # 默认实现或抽象方法

2.4 与普通继承的区别

  • 结构化:模板模式强调算法的结构和步骤的顺序,而普通继承可能没有这样的结构化要求。
  • 灵活性:模板模式允许子类在不改变算法结构的情况下,灵活地实现具体步骤,而普通继承可能会导致子类的实现与父类的实现紧密耦合。
  • 可维护性:模板模式通过将算法的固定部分集中在一个地方,便于管理和维护,而普通继承可能会导致代码分散,增加维护难度。

2.5 实际应用中的理解

在实际开发中,我们可能会无意中使用普通继承来实现某些功能,但这并不意味着我们在使用模板模式。模板模式的使用是有意识的设计选择,旨在解决特定的问题,如算法的复用和扩展。

例如,在一个数据处理应用中,如果我们有多个数据源(如 CSV、JSON、XML),我们可以使用模板模式来定义数据处理的通用步骤,而具体的读取、清洗和分析逻辑则在各自的子类中实现。这种方式使得我们可以轻松地添加新的数据源,而不需要修改现有的代码结构。

2.6 总结

模板模式不仅仅是面向对象的继承机制,它是一种设计思想,强调算法的结构和步骤的复用。通过使用模板模式,我们可以提高代码的可维护性和可扩展性,避免代码重复,并使得系统在面对变化时更加灵活。理解模板模式的目的和应用场景,可以帮助我们在设计软件时做出更好的决策。

相关文章:

Python 设计模式:模板模式

1. 什么是模板模式? 模板模式是一种行为设计模式,它定义了一个操作的算法的骨架,而将一些步骤延迟到子类中。模板模式允许子类在不改变算法结构的情况下,重新定义算法的某些特定步骤。 模板模式的核心思想是将算法的固定部分提取…...

HSTL详解

一、HSTL的基本定义 HSTL(High-Speed Transceiver Logic) 是一种针对高速数字电路设计的差分信号接口标准,主要用于高带宽、低功耗场景(如FPGA、ASIC、高速存储器接口)。其核心特性包括: 差分信号传输&…...

好用————python 库 下载 ,整合在一个小程序 UIUIUI

上图~ import os import time import threading import requests import subprocess import importlib import tkinter as tk from tkinter import ttk, messagebox, scrolledtext from concurrent.futures import ThreadPoolExecutor, as_completed from urllib.parse im…...

OpenVINO教程(五):实现YOLOv11+OpenVINO实时视频目标检测

目录 实现讲解效果展示完整代码 本文作为上篇博客的延续,在之前实现了图片推理的基础上,进一步介绍如何进行视频推理。 实现讲解 首先,我们需要对之前的 predict_and_show_image 函数进行拆分,将图像显示与推理器(pre…...

CentOS的安装以及网络配置

CentOS的下载 在学习docker之前,我们需要知道的就是docker是运行在Linux内核之上的,所以我们需要Linux环境的操作系统,当然了你也可以选择安装ubuntu等操作系统,如果你不想在本机安装的话还可以考虑买阿里或者华为的云服务器&…...

【初级】前端开发工程师面试100题(一)

本题库共计包含100题&#xff0c;考察html&#xff0c;css&#xff0c;js&#xff0c;以及react&#xff0c;vue&#xff0c;webpack等基础知识掌握情况。 HTML基础篇 说说你对HTML语义化的理解&#xff1f; 语义化就是用合适的标签表达合适的内容&#xff0c;比如<header&…...

eplan许可证与防火墙安全软件冲突

在使用EPLAN电气设计软件时&#xff0c;有时会遇到许可证与防火墙或安全软件之间的冲突。这种冲突可能导致许可证无法激活或软件无法正常运行&#xff0c;给用户带来诸多不便。本文将为您解析EPLAN许可证与防火墙/安全软件冲突的原因&#xff0c;并提供解决方案&#xff0c;帮助…...

「Java EE开发指南」用MyEclipse开发EJB 3无状态会话Bean(二)

本教程介绍在MyEclipse中开发EJB 3无状态会话bean&#xff0c;由于JPA实体和EJB 3实体非常相似&#xff0c;因此本教程不涉及EJB 3实体Bean的开发。在本教程中&#xff0c;您将学习如何&#xff1a; 创建EJB 3项目创建无状态会话bean部署并测试bean 在上文中&#xff08;点击…...

Stable Diffusion秋叶整合包V4独立版Python本地API连接指南

秋叶整合包V4独立版Python本地API连接指南 秋叶整合的Stable Diffusion V4独立版支持通过Python调用本地API实现自动化图像生成。以下是具体操作流程及注意事项&#xff1a; 一、启用API服务 启动器配置 • 在秋叶启动器的 高级选项 中添加以下参数&#xff1a; --api --liste…...

小程序 GET 接口两种传值方式

前言 一般 GET 接口只有两种URL 参数和路径参数 一&#xff1a;URL 参数&#xff08;推荐方式&#xff09; 你希望请求&#xff1a; https://serve.zimeinew.com/wx/products/info?id5124接口应该写成这样&#xff0c;用 req.query.id 取 ?id5124&#xff1a; app.get(&…...

深度学习在DOM解析中的应用:自动识别页面关键内容区块

摘要 本文介绍了如何在爬取东方财富吧&#xff08;https://www.eastmoney.com&#xff09;财经新闻时&#xff0c;利用深度学习模型对 DOM 树中的内容区块进行自动识别和过滤&#xff0c;并将新闻标题、时间、正文等关键信息分类存储。文章聚焦爬虫整体性能瓶颈&#xff0c;通…...

PyQt6实例_pyqtgraph多曲线显示工具_代码分享

目录 概述 效果 代码 返回结果对象 字符型横坐标 通用折线图工具 工具主界面 使用举例 概述 1 分析数据遇到需要一个股票多个指标对比或一个指标多个股票对比&#xff0c;涉及到同轴多条曲线的显示&#xff0c;所以开发了本工具。 2 多曲线显示部分可以当通用工具使…...

Linux网络编程 多线程Web服务器:HTTP协议与TCP并发实战

问题解答 TCP是如何防止SYN洪流攻击的&#xff1f; 方式有很多种&#xff0c;我仅举例部分&#xff1a; 1、调整内核参数 我们知道SYN洪流攻击的原理就是发送一系列无法完成三次握手的特殊信号&#xff0c;导致正常的能够完成三次握手的信号因为 连接队列空间不足&#xff…...

【Vulkan 入门系列】创建帧缓冲、命令池、命令缓存,和获取图片(六)

这一节主要介绍创建帧缓冲&#xff08;Framebuffer&#xff09;&#xff0c;创建命令池&#xff0c;创建命令缓存&#xff0c;和从文件加载 PNG 图像数据&#xff0c;解码为 RGBA 格式&#xff0c;并将像素数据暂存到 Vulkan 的 暂存缓冲区中。 一、创建帧缓冲 createFramebu…...

【Git】fork 和 branch 的区别

在 Git 中&#xff0c;“fork” 和 “branch” 是两个不同的概念&#xff0c;它们用于不同的场景并且服务于不同的目的。理解这两者的区别对于有效地使用 Git 进行版本控制非常重要。 1. Fork&#xff08;分叉&#xff09; 定义 Fork 是指在 GitHub、GitLab 等代码托管平台上…...

Qt 下载的地址集合

Qt 下载离线安装包 download.qt.io/archive/qt/5.14/5.14.2/ Qt 6 安装下载在线安装包 Index of /qt/official_releases/online_installers/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror...

java将pdf转换成word

1、jar包准备 在项目中新增lib目录&#xff0c;并将如下两个文件放入lib目录下 aspose-words-15.8.0-jdk16.jar aspose-pdf-22.9.jar 2、pom.xml配置 <dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId><versi…...

ubuntu下gcc/g++安装及不同版本切换

1. 查看当前gcc版本 $ gcc --version# 查看当前系统中已安装版本 $ ls /usr/bin/gcc*2. 安装新版本gcc $ sudo apt-get update# 这里以版本12为依据&#xff08;也可以通过源码方式安装&#xff0c;请自行Google&#xff01;&#xff09; $ sudo apt-get install -y gcc-12 g…...

缓存与内存;缺页中断;缓存映射:组相联

文章目录 内存&#xff08;RAM&#xff09;与缓存&#xff08;Cache&#xff09;Memory Management Unit缺页中断 多级缓存缓存替换策略缓存的映射方式 内存&#xff08;RAM&#xff09;与缓存&#xff08;Cache&#xff09; 缓存&#xff1a; CPU 内部或非常靠近的高速存储&a…...

FPGA入门学习Day1——设计一个DDS信号发生器

目录 一、DDS简介 &#xff08;一&#xff09;基本原理 &#xff08;二&#xff09;主要优势 &#xff08;三&#xff09;与传统技术的对比 二、FPGA存储器 &#xff08;一&#xff09;ROM波形存储器 &#xff08;二&#xff09;RAM随机存取存储器 &#xff08;三&…...

微信小程序拖拽排序有效果图

效果图 .wxml <view class"container" style"--w:{{w}}px;" wx:if"{{location.length}}"><view class"container-item" wx:for"{{list}}" wx:key"index" data-index"{{index}}"style"--…...

elasticsearch 查询检索

一、查询方式列举 1、多维度查询 关键词&#xff1a;bool must match {"query": {"bool": {"must": [{"match": {"server_name": "www.test.com"}},{"range": { //时间查询"createTime": …...

WT2000T专业录音芯片:破解普通录音设备信息留存、合规安全与远程协作三大难题

在快节奏的现代商业环境中&#xff0c;会议是企业决策、创意碰撞和战略部署的核心场景。然而&#xff0c;传统会议记录方式常面临效率低、信息遗漏、回溯困难等痛点。如何确保会议内容被精准记录并高效利用&#xff1f;会议室专用录音芯片应运而生&#xff0c;以智能化、高保真…...

【Python 学习笔记】 pip指令使用

系列文章目录 pip指令使用 文章目录 系列文章目录前言安装配置使用pip 管理Python包修改pip下载源 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 当前文章记录的是我在学习过程的一些笔记和思考&#xff0c;可能存在有误解的地方&#xff0c;仅供大家…...

与Ubuntu相关命令

windows将文件传输到Ubuntu 传输文件夹或文件 scp -r 本地文件夹或文件 ubuntu用户名IP地址:要传输到的文件夹路径 例如&#xff1a; scp -r .\04.py gao192.168.248.129:/home/gao 如果传输文件也可以去掉-r 安装软件 sudo apt-get update 更新软件包列表 sudo apt insta…...

C# 文件读取

文件读取是指使用 C# 程序从计算机文件系统中获取文件内容的过程。将存储在磁盘上的文件内容加载到内存中&#xff0c;供程序处理。主要类型有&#xff1a;文本文件读取&#xff08;如 .txt, .csv, .json, .xml&#xff09;&#xff1b;二进制文件读取&#xff08;如 .jpg, .pn…...

leetcode125.验证回文串

class Solution {public boolean isPalindrome(String s) {s s.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();for(int i0,js.length()-1;i<j;i,j--){if(s.charAt(i)!s.charAt(j))return false;}return true;} }...

【Android面试八股文】Android系统架构【一】

Android系统架构图 1.1 安卓系统启动 1.设备加电后执行第一段代码&#xff1a;Bootloader 系统引导分三种模式&#xff1a;fastboot&#xff0c;recovery&#xff0c;normal&#xff1a; fastboot模式&#xff1a;用于工厂模式的刷机。在关机状态下&#xff0c;按返回开机 键进…...

NLP高频面试题(五十二)——BERT 变体详解

在现代自然语言处理领域,BERT 系列模型不断演进,衍生出多种变体,它们通过改进预训练任务、模型结构和训练策略,在不同应用场景下取得了更优表现。本文首先概览主要 BERT 变体(如 ALBERT、RoBERTa、ELECTRA、SpanBERT、Transformer-XL 等),随后针对以下几个关键问题逐一展…...

【数据可视化-21】水质安全数据可视化:探索化学物质与水质安全的关联

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...