Python编码系列—Python模板方法模式:定义算法骨架,让子类实现细节

news2024/11/14 20:47:42

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。

🚀 探索专栏:学步_技术的首页 —— 持续学习,不断进步,让学习成为我们共同的习惯,让总结成为我们前进的动力。

🔍 技术导航:

  • 人工智能:深入探讨人工智能领域核心技术。
  • 自动驾驶:分享自动驾驶领域核心技术和实战经验。
  • 环境配置:分享Linux环境下相关技术领域环境配置所遇到的问题解决经验。
  • 图像生成:分享图像生成领域核心技术和实战经验。
  • 虚拟现实技术:分享虚拟现实技术领域核心技术和实战经验。

🌈 非常期待在这个数字世界里与您相遇,一起学习、探讨、成长。不要忘了订阅本专栏,让我们的技术之旅不再孤单!

💖💖💖 ✨✨ 欢迎关注和订阅,一起开启技术探索之旅! ✨✨

文章目录

  • 1. 背景介绍
  • 2. 原理
  • 3. 使用场景
  • 4. 代码样例
  • 5. 实际应用案例
  • 6. 总结

1. 背景介绍

在软件开发中,经常会遇到一些算法框架是固定的,但某些步骤的具体实现需要根据不同情况来定制。模板方法模式(Template Method Pattern)提供了一种解决方案,允许定义算法的骨架,将一些步骤的实现延迟到子类中。本文将深入探讨Python中的模板方法模式,包括其背景、原理、使用场景、代码实现和实际应用案例。

模板方法模式是一种行为型设计模式,它在父类中定义一个算法的框架,允许子类在不改变算法结构的情况下重写算法的某些特定步骤。
在这里插入图片描述

2. 原理

模板方法模式的核心原理包括:

  • 定义模板方法:在抽象类中定义一个模板方法,该方法定义算法的步骤和顺序。
  • 实现默认步骤:在抽象类中实现算法的一些步骤,这些步骤通常是通用的。
  • 定义抽象步骤:将某些步骤声明为抽象方法,让子类实现这些步骤。
  • 子类实现抽象步骤:子类根据具体需求实现这些抽象步骤。

模板方法模式通过在抽象类中定义算法的框架,允许子类在不改变算法结构的前提下,重新定义算法的某些特定步骤。这种模式使得算法的变化细节被隔离在子类中,从而提高了代码的可维护性和可扩展性。下面详细探讨模板方法模式的核心原理:

定义模板方法
模板方法是抽象类中的一个具体方法,它定义了算法的执行顺序和步骤。模板方法通常调用一系列抽象操作,这些操作在模板方法中按一定的顺序被执行,构成了一个完整的算法框架。模板方法提供了算法的“骨架”,而具体的实现则留给子类。

class AbstractClass:
    def template_method(self):
        # 模板方法定义了算法的步骤
        self.base_operation1()
        self.required_operations1()
        self.base_operation2()
        self.hook1()
        self.required_operations2()
        self.base_operation3()
        self.hook2()

在这个例子中,template_method是模板方法,它定义了算法的执行顺序。

实现默认步骤
在抽象类中,除了定义模板方法外,还可以实现一些默认步骤。这些步骤通常是通用的,不需要子类去重新实现。默认步骤的实现可以直接在抽象类中完成,也可以是留空的,等待子类去实现。

class AbstractClass:
    def base_operation1(self):
        # 默认步骤的实现
        print("Default implementation of base operation 1")

在这个例子中,base_operation1是一个默认步骤,它提供了一个通用的实现。

定义抽象步骤
抽象步骤是算法框架中需要子类去实现的部分。这些步骤在模板方法中被调用,但具体的实现需要留给子类。通过定义抽象方法,抽象类强制子类去实现这些步骤。

class AbstractClass:
    @abstractmethod
    def required_operations1(self):
        # 抽象步骤由子类实现
        pass

在这个例子中,required_operations1是一个抽象方法,它没有具体的实现,需要子类去提供。

子类实现抽象步骤
子类通过实现抽象类中的抽象步骤来完成算法的特定部分。子类可以根据自己的需求,提供这些步骤的具体实现。这样,不同的子类可以以不同的方式实现相同的算法框架。

class ConcreteClass(AbstractClass):
    def required_operations1(self):
        # 子类实现抽象步骤
        print("Concrete implementation of required operation 1")

在这个例子中,ConcreteClass实现了required_operations1方法,提供了算法的一个特定步骤的实现。

通过这些核心原理,模板方法模式使得算法的结构固定,而算法的某些步骤可以灵活变化。这种模式非常适合于那些算法框架固定,但需要根据不同情况调整某些步骤的场景。

3. 使用场景

模板方法模式适用于以下场景:

  • 算法框架固定:当算法的整体步骤是固定的,但某些步骤需要根据子类不同而不同。
  • 需要控制子类扩展:当需要控制子类如何扩展或改变算法时。

4. 代码样例

以下是一个Python中实现模板方法模式的示例:

from abc import ABC, abstractmethod

class AbstractClass(ABC):
    def template_method(self):
        print("Start of template method.")
        self.base_operation1()
        self.required_operations1()
        self.base_operation2()
        self.hook1()
        self.required_operations2()
        self.base_operation3()
        self.hook2()
        print("End of template method.")

    def base_operation1(self):
        print("Base operation 1")

    def base_operation2(self):
        print("Base operation 2")

    def base_operation3(self):
        print("Base operation 3")

    # 定义抽象方法
    @abstractmethod
    def required_operations1(self):
        pass

    @abstractmethod
    def required_operations2(self):
        pass

    # 定义钩子方法
    def hook1(self):
        pass

    def hook2(self):
        pass

class ConcreteClass(AbstractClass):
    def required_operations1(self):
        print("Required operation 1")

    def required_operations2(self):
        print("Required operation 2")

    def hook1(self):
        print("Hook 1")

    def hook2(self):
        print("Hook 2")

# 客户端代码
if __name__ == "__main__":
    concrete = ConcreteClass()
    concrete.template_method()

5. 实际应用案例

假设我们正在开发一个电商平台,需要处理订单的不同流程,如验证、支付、发货等,但每个步骤的具体实现可能因不同类型的订单而异。我们可以使用模板方法模式来定义订单处理的框架。

class OrderProcessing(AbstractClass):
    def required_operations1(self):
        print("Validate order")

    def required_operations2(self):
        print("Process payment")

    def hook1(self):
        print("Log order details")

    def hook2(self):
        print("Prepare invoice")

class SpecialOrderProcessing(OrderProcessing):
    def required_operations2(self):
        print("Process special payment")

# 客户端代码
if __name__ == "__main__":
    normal_order = OrderProcessing()
    normal_order.template_method()

    special_order = SpecialOrderProcessing()
    special_order.template_method()

6. 总结

模板方法模式是一种非常实用的设计模式,它通过定义算法的骨架,允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式在处理具有固定算法框架但需要定制某些步骤的场景中非常有用。

设计模式是软件设计中的艺术,模板方法模式作为其中的一种,为我们提供了一种优雅的方式来定义和扩展算法。希望本文能够帮助你在Python项目中更好地应用模板方法模式,提升代码的质量和灵活性。

🌟 在这篇博文的旅程中,感谢您的陪伴与阅读。如果内容对您有所启发或帮助,请不要吝啬您的点赞 👍🏻,这是对我最大的鼓励和支持。

📚 本人虽致力于提供准确且深入的技术分享,但学识有限,难免会有疏漏之处。如有不足或错误,恳请各位业界同仁在评论区留下宝贵意见,您的批评指正是我不断进步的动力!😄😄😄

💖💖💖 如果您发现这篇博文对您的研究或工作有所裨益,请不吝点赞、收藏,或分享给更多需要的朋友,让知识的力量传播得更远。

🔥🔥🔥 “Stay Hungry, Stay Foolish” —— 求知的道路永无止境,让我们保持渴望与初心,面对挑战,勇往直前。无论前路多么漫长,只要我们坚持不懈,终将抵达目的地。🌙🌙🌙

👋🏻 在此,我也邀请您加入我的技术交流社区,共同探讨、学习和成长。让我们携手并进,共创辉煌!
在这里插入图片描述

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

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

相关文章

STM32F407单片机编程入门(十六) DMA详解及ADC-DMA方式采集含源码

文章目录 一.概要二.STM32F407VET6单片机DMA外设特点三.STM32F407单片机DMA内部结构图四.DMA各通道请求五.STM32F407VET6单片机ADC-DMA采集例程六.工程源代码下载七.小结 一.概要 基本概念: DMA是Direct Memory Access的首字母缩写,是一种完全由硬件执行数据交换的…

RK3568教学实验箱_操作教程:5-15 直流电机控制实验

一、产品简介 TL3568-PlusTEB人工智能实验箱 国产高性能处理器 64 位 4 核低功耗 2.0 GHz超高主频 1T 超高算力 NPU 兼容鸿蒙等国产操作系统 二、实验目的 1、熟悉Qt程序的开发流程; 2、掌握Qt Creator的基础开发使用; 3、通过编写Qt程序实现直流…

骨架行为识别-论文复现(论文复现)

骨架行为识别-论文复现(论文复现) 本文所涉及所有资源均在传知代码平台可获取 序言 骨架行为识别的定义 骨架行为识别是指通过分析人体骨架的运动轨迹和姿态,来识别和理解人体的行为动作。它是计算机视觉和模式识别领域的一个重要研究方向&a…

力扣上刷题之C语言实现-Days1

一. 简介 本文记录一下力扣的逻辑题。主要是数组方面的,使用 C语言实现。 二. 涉及数组的 C语言逻辑题 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那 两个 整数,并返回它们的…

C++笔试强训15、16、17

文章目录 笔试强训15一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训16一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训17一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训15 一、选择题 1-5题 共有派生下,派生类的成员函数只能访问基类的…

大模型训练不难,三步即可实现

前言 初步认识了大模型长什么样了,接下来一起来看看如何训练出一个大模型。 训练方式,这里主要参考OpenAI发表的关于InstructGPT的相关训练步骤,主流的大模型训练基本形式大多也是类似的: 1、预训练(Pretraining&a…

安卓13设置动态修改设置显示版本号 版本号增加信息显示 android13增加序列号

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号 在这里显示了系统的一些信息,但是这里面的信息并不包含序列号之类的信息,我们修改下系统设置,在这里增加上相关的序列号。 2.问题分析…

C语言 使用scanf函数时出现错误代码C4996

文章目录 错误样式解决方法方法一:使用安全的函数替代方法二:禁用警告方法三:检查并修改编译器设置 错误样式 C4996 ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _C…

《算法岗面试宝典》正式发布

大家好,历时半年完善,《算法岗面试宝典》 终于可以跟大家见面了。 最近 ChatGPT 爆火,推动了技术圈对大模型算法场景落地的热情,就业市场招聘人数越来越多,算法岗一跃成为竞争难度第一的岗位。 岗位方向 从细分方向…

K8s Calico替换为Cilium,以及安装Cilium过程

一、删除Calico kubectl delete daemonset calico-node -n kube-systemkubectl delete deployment calico-kube-controllers -n kube-system kubectl delete ds kube-flannel-ds -n kube-system kubectl delete cm calico-config -n kube-system kubectl delete secret calico…

YOLOv5训练COCO2017数据集

网上没找到适合新手小白的教程,看了些教程,但还是没法解决自己遇到的问题。记录下自己的过程,希望能提供点帮助。 默认已经部署好了yolov5。 安装部署yolov5可参考以下: ubuntu20.04配置YOLOV5(非虚拟机)_ubuntu系统实现yolov5没有显卡-CSDN博客 目录 一、数据集下载…

Java基础-零拷贝

文章目录 什么是零拷贝?传统IO执行过程零拷贝的意义零拷贝的主要实现方式实际应用场景零拷贝的优势零拷贝的局限性 Java 中的零拷贝实现FileChannel.transferTo()FileChannel.transferFrom() 相关知识点解释什么是DMA内核空间和用户空间什么是用户态、内核态什么是上…

2012年408考研真题-数据结构

8.【2012统考真题】求整数n(n≥0)的阶乘的算法如下&#xff0c;其时间复杂度是(&#xff09;。 int fact(int n){ if(n<1) return 1; return n*fact (n-1); } A. O(log2n) B. O(n) C. O(nlog2n) D. O(n^2) 解析&#xff1a; 观察代码&#xff0c;我们不…

如何在openKylin中配置ssh服务并实现远程连接开放麒麟系统(1)

文章目录 前言1. 安装SSH服务2. 本地SSH连接测试3. openKylin安装Cpolar4. 配置 SSH公网地址5. 公网远程SSH连接6. 固定SSH公网地址7. SSH固定地址连接 前言 本文主要介绍如何在openKlyin系统中设置ssh连接&#xff0c;并结合cpolar内网穿透工具实现远程也可以ssh连接本地局域…

功能 接口测试,详解从抓包 +linux 日志 + 数据库的 bug 定位!

我在跟很多测试人员交流中发现&#xff0c;很大一部分测试工程师在进行功能和接口测试过程中&#xff0c;对于发现的bug很少去进行定位&#xff0c;只是将bug基于业务操作上如何出现的&#xff0c;进行描述&#xff1b;至于bug产生的原因&#xff0c;开发自己排查去吧。本文中&…

多语言文本 AI 纠错格式化 API 数据接口

多语言文本 AI 纠错格式化 API 数据接口 AI / 文本处理 AI 模型智能纠正 语法纠错 / 文本格式化。 1. 产品功能 支持多语言文本的语法纠错&#xff1b;自动识别并纠正拼写错误、语法错误和标点符号使用不当&#xff1b;优化文本格式&#xff0c;提高可读性&#xff1b;基于AI…

《李·斯莫林讲量子引力》:在不断运动的宇宙中探究离散的时空

可能是斯莫林的书读得并不多&#xff0c;感觉他讲故事的能力不如讲物理定律的能力。前半部分纯知识的可读性要好于后面讲述理论的创造过程的故事。如作者所说现代科学没有任何领域是单打独斗&#xff0c;而是不断探索&#xff0c;在团队中&#xff0c;前人和其他专业领域专家合…

vue使用PDF.JS踩的坑--部署到服务器上显示pdf.mjs viewer.mjs找不到资源

之前项目使用的pdf.js 是2.15.349版本&#xff0c;最近换了一个4.6.82的版本&#xff0c;在本地上浏览文件运行的好好的&#xff0c;但是发布到服务器&#xff08;IIS&#xff09;上打不开文件&#xff0c;控制台提示找不到pdf.mjs viewer.mjs。 之前使用的2.15.349pdf和viewer…

76、Python之函数式编程:柯里化都不懂,别说你会函数式编程

引言 很多时候&#xff0c;我们在定义函数处理比较复杂的业务逻辑时&#xff0c;首先是想着遵照“单一职能原则&#xff08;SRP&#xff09;”&#xff0c;尽量拆分为功能单一、足够精简的函数&#xff0c;以便保证代码的可读性和可扩展性。但是&#xff0c;有些逻辑就是没法拆…

2024年双十一有什么好物值得买呢?双十一必买好物清单

双十一买什么犒劳自己既不会浪费钱又可以增添生活的幸福感&#xff1f;以下就整理了五款更适合与秋冬独自生活相伴的好物&#xff0c;精致增加生活氛围感&#xff0c;热爱生活的同时更好的爱自己&#xff01;努力工作和生活当然也要更好的享受生活&#xff0c;给生活创造更多美…