python设计模式:模板方法模式

news2024/11/19 11:16:21

17a9ff81816998992a2dfbd205ee8d75.jpeg

更多Python学习内容:ipengtao.com

软件设计和编程中,设计模式是一种有助于解决常见问题的强大工具。其中之一是"模板方法模式",它是一种行为型设计模式,允许你定义一个算法的骨架,但将一些步骤的具体实现延迟到子类中。在本文中,我们将深入研究模板方法模式,并提供详细的示例代码,以帮助你更好地理解和应用这一模式。

模板方法模式的基本概念

模板方法模式的核心思想是定义一个模板方法,该方法包含一个算法的骨架,但留下一些步骤的实现细节,这些细节由子类来决定。这允许在不改变算法结构的情况下,通过在子类中提供具体实现来自定义算法的某些部分。

模板方法模式的示例

通过一个简单的示例来说明模板方法模式。假设正在开发一个制作咖啡和茶的应用程序,其中有一些共同的步骤,如煮水、冲泡、倒入杯子等,但每种饮料有不同的冲泡方法。

以下是一个使用模板方法模式的示例代码:

from abc import ABC, abstractmethod

class Beverage(ABC):
    def prepare(self):
        self.boil_water()
        self.brew()
        self.pour_in_cup()
        self.add_condiments()

    def boil_water(self):
        print("Boiling water")

    @abstractmethod
    def brew(self):
        pass

    def pour_in_cup(self):
        print("Pouring into cup")

    @abstractmethod
    def add_condiments(self):
        pass

class Coffee(Beverage):
    def brew(self):
        print("Dripping coffee through filter")

    def add_condiments(self):
        print("Adding sugar and milk")

class Tea(Beverage):
    def brew(self):
        print("Steeping the tea")

    def add_condiments(self):
        print("Adding lemon")

def main():
    coffee = Coffee()
    tea = Tea()

    print("Making coffee...")
    coffee.prepare()

    print("\nMaking tea...")
    tea.prepare()

if __name__ == "__main__":
    main()

在这个示例中,首先定义了一个抽象基类Beverage,它包含了制备饮料的模板方法prepare(),以及一些共同的步骤,如boil_water()pour_in_cup()。然后,创建了两个具体子类CoffeeTea,它们分别提供了brew()add_condiments()的具体实现。

main()函数中,可以看到如何使用这些类来制备咖啡和茶,而不必重复编写共同的步骤。

模板方法模式的优点

模板方法模式具有一些重要的优点,使其成为解决特定问题的强大工具:

  1. 代码重用性: 模板方法模式允许将算法的骨架抽象到父类中,使多个子类能够共享相同的代码,减少了代码的重复性。

  2. 灵活性和可扩展性: 子类可以轻松地修改或扩展父类的算法中的特定步骤,而不需要改变整体算法的结构。

  3. 封装性: 算法的细节被封装在子类中,父类只关心算法的整体结构,使代码更容易理解和维护。

  4. 遵循开放-封闭原则: 模板方法模式鼓励将可变部分的代码封装在子类中,使得在不修改已有代码的情况下可以引入新的子类来扩展功能。

模板方法模式的注意事项

虽然模板方法模式具有许多优点,但在使用时也需要注意一些事项:

  1. 父类和子类之间的关系: 子类应该遵循父类定义的算法骨架,否则可能会破坏整个模式的结构。

  2. 过度使用: 不应该滥用模板方法模式,只有当多个类具有相似的算法结构时才应考虑使用。

  3. 不适合所有情况: 并不是所有的算法都适合使用模板方法模式,有些情况下可能会更好地使用其他设计模式或方法来解决问题。

总结

模板方法模式是一种有助于提高代码复用性和可维护性的设计模式,特别适用于具有共同算法结构的多个类。通过将算法的骨架放在父类中,并允许子类提供具体实现,模板方法模式使得代码更加灵活、可扩展和易于维护。希望这篇文章的示例和讨论有助于大家更好地理解和应用模板方法模式。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

  100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

0ac2fe299a982a6c33433503b2d18751.png

点击“阅读原文”,获取更多学习内容

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

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

相关文章

【elfboard linux开发板】7.i2C工具应用与aht20温湿度寄存器读取

1. I2C工具查看aht20的温湿度寄存器值 1.1 原理图 传感器通过IIC方式进行通信,连接的为IIC1总线,且设备地址为0x38,实际上通过后续iic工具查询,这个设备是挂载在iic-0上 1.2 I2C工具 通过i2c工具可以实现查询i2c总线、以及上面…

第7章 参数估计(重点)

注意:区分正态总体还是非正态总体、总体方差已知还是未知、样本是大样本还是小样本,从而使用对应的Z或者t分布。

面试题理解深层次的数组名

目录 引言 一:一维数组 举例如下 1.铺垫知识 数组名是数组首元素的地址,但是有两个特殊情况 (1)sizeof(数组名) (2)&数组名 2.分析讲解上述代码结果 2.字符数组 举例一如下 1.知识铺垫 …

CMake入门教程【基础篇】CMake+Visual Studio2022构建C++项目

文章目录 1.概述2.Visual Studio 2022简介3.安装Visual Studio 20224.安装CMake5.创建CMake项目6. 构建项目 1.概述 CMake和Visual Studio 2022结合 在现代软件开发中,CMake和Visual Studio 2022的结合提供了一个强大的环境,用于构建和管理各种规模的C项…

STM32 学习(二)GPIO

目录 一、GPIO 简介 1.1 GPIO 基本结构 1.2 GPIO 位结构 1.3 GPIO 工作模式 二、GPIO 输出 三、GPIO 输入 1.1 传感器模块 1.2 开关 一、GPIO 简介 GPIO(General Purpose Input Output)即通用输入输出口。 1.1 GPIO 基本结构 如下图&#xff0…

C++基础:静态变量(保姆级讲解)

1.静态变量定义 在C的,静态变量是一个非常有用的特性,它在程序执行期间只初始化一次,并在程序的整个执行期间都保持其值。 可能这样子说大家无法特别理解:静态变量该怎么定义呢?静态变量的作用是什么?该如…

算法29:不同路径问题(力扣62和63题)--针对算法28进行扩展

题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff0…

网络端口(包括TCP端口和UDP端口)的作用、定义、分类,以及在视频监控和流媒体通信中的定义

目 录 一、什么地方会用到网络端口? 二、端口的定义和作用 (一)TCP协议和UDP协议 (二)端口的定义 (三)在TCP/IP体系中,端口(TCP和UDP)的作用 (…

Visual Studio 2017 + opencv4.6 + contribute + Cmake(Aruco配置版本)指南

之前配置过一次这个,想起这玩意就难受,贼难配置。由于要用到里面的一个库,不得已再进行配置。看网上的博客是真的难受,这写一块,那里写一块,乱七八糟,配置一顿发现写的都是错的,还得…

leetcode刷题日记:222. Count Complete Tree Nodes(完全二叉树的节点个数)

这一道题,我们可以选择直接进行二叉树的遍历,将所有结点遍历一遍就能得到完全二叉树的结点个数,时间复杂度为O(n)。 代码如下: int countNodes(struct TreeNode* root) {if(rootNULL){return 0;}return countNodes(root->left…

【Linux】socket基础API

目录 1. 创建socket(TCP/UDP,客户端服务器) 1.1 第一个参数——domain 1.2 第二个参数——type 1.3 第三个参数——protocol 2. 绑定socket地址(TCP/UDP,服务器) 2.1 字节序及转换函数 2.2 IP地址及…

【数字图像处理技术与应用】2023-2024上图像处理期中-云南农业大学

一、填空题(每空2 分,共 30 分) 1、图像就是3D 场景在 二维 平面上的影像,根据其存储方式和表现形式,可以将图像分为 模拟 图像和数字图像两大类; 2、在用计算机对数字图像处理中,常用一个 二…

[C#]yolov8-onnx在winform部署手势识别模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

promise.prototype.finally重写和兼容火狐低版本浏览器

一、finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的 let promise new Promise() promise .then(result > {}) .catch(error > {}) .finally(() > {})finally方法的回调函数不接受任何参数;finally方法…

指令、电流、上下斜坡、颤振频率可调型比例放大器

控制不带电反馈的单或双比例电磁铁的比例阀,如比例泵阀、比例插装阀、比例方向阀、比例压力阀、比例流量阀、比例叠加阀等; 常规比例阀控制电流如650mA、700mA、760mA、830mA、950mA、1.6A、2.5A、3A等; 带数显区显示及当前参数现场可调,如…

php合并数组的几种方式 并简述其特点

目前工作中接触到的PHP数组合并方式主要有三种&#xff1a; 1、操作符 2、array_merge() 3、array_merge_recursive() 它们的区别主要体现在对于相同键名&#xff08;数字键名、字符串键名&#xff09;的处理方式&#xff0c; 一 相同字符串键 <?php$arrFirst [&quo…

键盘数字键打不出来怎么解锁?收藏好这4个简单方法!

“我在使用电脑进行办公时&#xff0c;突然发现我电脑键盘的数字键无法输入&#xff0c;这该怎么办呢&#xff1f;我应该如何解锁呢&#xff1f;请给我出出主意吧&#xff01;” 在日常使用电脑时&#xff0c;很多用户都需要使用键盘输入文字。但有时候部分用户也会遇到键盘数字…

SpringBoot: 通过MyBatis访问ClickHouse

一、ClickHouse中建表&#xff0c;添加数据 二、SpringBoot项目添加mybatis、clickhouse、druid相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version></dependency>…

【Proteus仿真】【Arduino单片机】汽车尾气检测报警系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用按键、LCD1602液晶、蜂鸣器模块、CO、NOx、HC和PM2.5气体传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示CO、NOx、HC和…