【Python笔记-设计模式】模板方法模式

一、说明

模板方法模式是一种行为设计模式,就是继承和多态的使用,将通用操作在父类中实现,不同操作的细节在子类中具体实现,父类只声明接口。

(一) 解决问题

  1. 减少相似逻辑的重复代码,提高代码复用性
  2. 提高代码逻辑性,使其易于维护

(二) 使用场景

  • 当有一些操作具有相同的步骤,但具体实现步骤不同时
  • 当需要控制子类的扩展时

二、结构

  1. 抽象类(Abstract­Class)会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现。
  2. 具体类(Concrete­Class)可以重写所有步骤,但不能重写模板方法自身。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
模板方法模式

例:使用模板方法定义饮料制作流程,子类实现或重写具体的制作步骤
"""

from abc import ABC, abstractmethod


class BeverageTemplate(ABC):
    """抽象类(Abstract Class)"""
    def prepare_beverage(self):
        self.boil_water()
        self.brew()
        self.pour_in_cup()
        if self.customer_wants_condiments():
            self.add_condiments()

    def boil_water(self):
        print("烧水")

    @abstractmethod
    def brew(self):
        pass

    def pour_in_cup(self):
        print("将水倒进杯子里")

    @abstractmethod
    def add_condiments(self):
        pass

    def customer_wants_condiments(self):
        return True


class Coffee(BeverageTemplate):
    """具体类(Concrete Class)"""
    def brew(self):
        print("将咖啡滴过滤网")

    def add_condiments(self):
        print("加糖和牛奶")

    def customer_wants_condiments(self):
        return False


class Tea(BeverageTemplate):
    """具体类(Concrete Class)"""
    def brew(self):
        print("倒入茶叶")

    def add_condiments(self):
        print("加柠檬")


if __name__ == "__main__":
    """
        煮咖啡...
        烧水
        将咖啡滴过滤网
        将水倒进杯子里
        ==============================
        泡茶...
        烧水
        倒入茶叶
        将水倒进杯子里
        加柠檬
    """
    print("煮咖啡...")
    coffee = Coffee()
    coffee.prepare_beverage()

    print("=" * 30)

    print("泡茶...")
    tea = Tea()
    tea.prepare_beverage()

四、优缺点

优点

  • 提高代码复用性:将公共部分抽取到父类中
  • 便于维护:只需修改父类即可影响所有子类
  • 符合开闭原则:通过增加子类扩展功能,而不修改原有代码

缺点

  • 可能导致类的数量增加,增加系统复杂性
  • 父类定义了实现框架,子类实现具体步骤,导致子类必须遵循父类的约束,灵活性受限

【Python笔记】设计模式-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入探讨Python中的os模块:基础大总结与实战【第109篇—os模块】

深入探讨Python中的os模块:基础大总结与实战 在Python编程中,操作系统(os)模块是一个强大的工具,它提供了与操作系统交互的各种功能,使得开发者能够轻松地执行文件和目录操作、获取系统信息以及执行系统命令。在本篇技术博客中&a…

React中对表格实现列表的拖拽排序

1. 效果:推拽手柄列 2. 实现: react中我们需要两个包来实现 ‘array-move’‘react-sortable-hoc’Installation Use npm $ npm install react-sortable-hoc --save 引入 import { arrayMoveImmutable } from array-move import { SortableContainer, SortableElement, Sort…

具身智能计算系统,机器人时代的 Android | 新程序员

【导读】具身智能作为一种新兴的研究视角和方法论,正在刷新我们对智能本质及其发展的理解:传统的 AI 模型往往将智能视为一种独立于实体存在的抽象能力,而具身智能则主张智能是实体与其环境持续互动的结果。 本文深度剖析了具身智能计算系统…

Unity(第十六部)声音和视频

声音 1、听声音 创建相机的时候,相机自带Audio Listener 多个相机的时候,我们只保留一个Audio Listener就可以 2、声音源,环境音 添加Audio Source就行中文叫声音源 3、脚本执行的声音 using System.Collections; using System.Collection…

如何用ai智能写作?推荐5款优秀的AI写作神器

写作是件繁琐的事情,也是需要耗费精力和时间的,还好目前有了ai写作神器的出现,帮助我们解决了不少的写作难题。这些AI写作工具不仅可以帮助我们提高写作效率,还能够生成高质量的内容。在本文中,我将向你推荐5款优秀的A…

CentOS 定时调度

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

深度学习 精选笔记(7)前向传播、反向传播和计算图

学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…

当无人机飞手真的有前途吗?无人机工作怎么找,感觉找不到太难了?无人机飞手未来的出路在哪里?

无人机飞手这个职业的前途很大程度上取决于市场需求和行业发展趋势。随着无人机技术的不断进步和应用领域的扩大,无人机飞手的需求量也在逐渐增加。然而,这个职业的发展也受到政策法规、技术更新换代等因素的影响,因此需要不断学习新技术和适…

Fastjson2 <== 2.0.26反序列漏洞

根据Y4TACKER师傅在2023-03-20发布了一篇关于Fastjson原生反序列化的文章,文章中引入注目的是利用条件限制条件,不常常关注漏洞预警或者内容的几乎都是未发觉Fastjson2 到Fastjson2 2.0.26版本都有问题,其实如果单独去使用一些关键词去搜索&a…

python 小游戏《2048》字符版非图形界面

参考链接: 闲谈2048小游戏和数组的旋转及翻转和转置 目录 2048 一、方阵类 二、随机插入1或2 三、 合并和递增 四、 判断和移动 五、 键盘控制 完整源代码 玩法过程 2048 上回说到2048小游戏中数组的各种旋转、翻转的方法,就是为代码编程作准…

单词规律00

题目链接 单词规律 题目描述 注意点 pattern只包含小写英文字母s只包含小写英文字母和 ’ ’s不包含任何前导或尾随对空格s中每个单词都被 单个空格 分隔 解答思路 本题与上一次同构字符串类似,思路可以参照同构字符串 代码 class Solution {public boolean …

C++——内存管理(new和delete)详解

目录 C/C内存管理 案例:变量在内存中到底会在哪? New和delete Operator new和operator delete函数 New和delete的原理 对内置类型 对自定义类型 定位new New/delete和malloc/free的区别 C/C内存管理 C/C内存管理分布图:(从…

C语言while 语句的基本格式是什么?

一、问题 C语⾔中有三种循环语句,while 语句是其中的⼀个,它的基本格式是怎样的呢? 二、解答 while 语句的⼀般形式为: while(表达式) 语句; 其中,表达式是循环条件,语句为循环体。 注意: …

uni-app 微信小程序:启用组件按需注入

原文地址:uni-app 微信小程序:启用组件按需注入 - 掘金 只需添加以下代码"lazyCodeLoading": "requiredComponents"

养娃到大学毕业要68万?不算不知道一算要起跳!

最近看到的新话题,第一反映就是养一个娃要这么多费用吗? 以我马上就要上大学的娃家长身份,索性粗针大线的做了一个预估,让我们一起来探讨一下吧: 现正在考虑娃是可以读国内正常的公办大学还是能读国内的合作办学大学…

【机器学习实战1】泰坦尼克号:灾难中的机器学习(一)数据预处理

🌸博主主页:釉色清风🌸文章专栏:机器学习实战🌸今日语录:不要一直责怪过去的自己,她曾经站在雾里也很迷茫。 🌼实战项目简介 本次项目是kaggle上的一个入门比赛 :Titani…

护眼灯到底有用吗知乎?5大超强实力护眼台灯测评推荐!

护眼台灯无疑是每个学子必备的学习用具,那到底有没有用呢?其实真正好的护眼灯在一定程度上对保护学生的眼睛来说肯定是有用的。当然前提是要选购到优质的护眼台灯,保障各项性能都是合格的,使用起来才安全放心。 一、护眼台灯是如何…

Python web框架fastapi数据库操作ORM(一)

文章目录 Fastapi ORM操作1、创建模型2、创建数据库连接配置文件3、启动项目4、根据模型类创建数据库表1. 初始化配置,只需要使用一次2. 初始化数据库,一般情况下只用一次3. 更新模型并进行迁移4. 重新执行迁移,写入数据库5. 回到上一个版本6…

uniapp+vue基于Android的图书馆借阅系统qb4y3-nodejs-php-pyton

uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 框架支持:springboot/django/php/Ssm/flask/express均支持 前端开发:vue 语言:pythonjavanode.jsphp均支持 运行软件:idea/eclip…

【Javascript编程实操01】判断最大数、奇偶数、是否成年

目录 前言 1、求两个数的最大数 代码: 实现效果: 2、判断一个整数是偶数还是奇数 代码: 实现效果: 3、判断一个人的年龄是否满18岁 代码: 实现效果: 总结 前言 从今天开始正式进入了Web前端第二…
最新文章