Python 设计模式:模板模式

news2025/4/24 22:55:31

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()  # 保存结果

    @abstractmethod
    def read_data(self):
        pass

    @abstractmethod
    def clean_data(self):
        pass

    @abstractmethod
    def analyze_data(self):
        pass

    @abstractmethod
    def 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 总结

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

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

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

相关文章

好用————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等操作系统,如果你不想在本机安装的话还可以考虑买阿里或者华为的云服务器&…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

效果图 .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"--…

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

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

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

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

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;按返回开机 键进…

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

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

【prometheus+Grafana篇】从零开始:Linux 7.6 上二进制安装 Prometheus、Grafana 和 Node Exporter

&#x1f4ab;《博主主页》&#xff1a;奈斯DB-CSDN博客 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了解 &#x1f496;如果觉得文章对你有所帮…

STM32(M4)入门:GPIO与位带操作(价值 3w + 的嵌入式开发指南)

一&#xff1a;GPIO 1.1 了解时钟树&#xff08;必懂的硬件基础&#xff09; 在 STM32 开发中&#xff0c;时钟系统是一切外设工作的 “心脏”。理解时钟树的工作原理&#xff0c;是正确配置 GPIO、UART 等外设的核心前提。 1.1.1 为什么必须开启外设时钟&#xff1f; 1. 计…

Linux419 三次握手四次挥手抓包 wireshark

还是Notfound 没连接 可能我在/home 准备配置静态IP vim ctrlr 撤销 u撤销 配置成功 准备关闭防火墙 准备配置 YUM源 df -h 未看到sr0文件 准备排查 准备挂载 还是没连接 计划重启 有了 不重启了 挂载准备 修改配置文件准备 准备清理缓存 ok 重新修改配…