模板方法模式(python)

news2024/9/21 12:09:33

一、模式定义

1.模板方法模式(Template Method Pattern):定义一个操作中算法的框架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2.模板方法是一种类行为型模式。

二、模式结构

模板方法模式包含如下角色:
1. AbstractClass(抽象类)
在抽象类中定义一系列基本操作(Primitive Operations),这些基本操作可以是具体的。也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义并实现一个算法的各个步骤。同时,在抽象类中实现了一个模板方法,用于定义一个算法的骨架,此模板方法不仅可以调用基本操作,还可以调用在抽象类中声明而在其子类中实现的抽象方法,当然也可以调用其他对象中的方法。
2.ConcreteClass(具体子类)
具体子类是抽象类的子类,用于实现在父类中定义的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中实现的具体基本操作。

三、例子

1. AbstractClass

# @Time    : 2022/11/29 16:41
# @Author  : ZQH
# @FileName: AbstractClass.py
# @Software: PyCharm



from abc import ABCMeta, abstractmethod
from time import sleep


class Window(metaclass=ABCMeta):
    @abstractmethod
    def start(self):
        pass
    @abstractmethod
    def repaint(self):
        pass
    @abstractmethod
    def stop(self):
        pass

    def run(self):
        self.start()
        while True:
            try:
                self.repaint()
                sleep(1)
            except KeyboardInterrupt:
                self.stop()
                break

 2.ConcreteClass

# @Time    : 2022/11/29 16:41
# @Author  : ZQH
# @FileName: ConcreteClass.py
# @Software: PyCharm

from AbstractClass import Window


class MyWindow(Window):
    def __init__(self,msg):
        self.msg = msg
    def start(self):
        print('窗口开始运行')
    def stop(self):
        print('窗口停止')

    def repaint(self):
        print(self.msg)


3.Client

from ConcreteClass import MyWindow


if __name__ == '__main__':

    myWindow = MyWindow('hello')
    myWindow.run()

四、优缺点

1.模板方法模式的优点
(1) 模板方法模式在一个类中形式化地定义算法,而由它的子类实现细节的处理,模板方法模式的优势是在子类定义详细的处理算法时不会改变算法的结构。
(2) 模板方法模式是一种代码复用的基本技术,它在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为。
(3) 模板方法模式提供了一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,符合“开闭原则”。


2.模板方法模式的缺点
每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,但是更加符合“单一职责原则”,使得类的内聚性得以提高。

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

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

相关文章

斩获三奖 | 国产BI行业唯一获奖,Smartbi荣获36氪、数据猿等多项荣誉

入选36氪新经济之王年度企业近日,36氪WISE2022 新经济之王盛会隆重举行,会上正式发布了“WISE2022 新经济之王年度企业”名册,思迈特软件成功斩获“WISE2022 新经济之王年度企业”荣誉,成为国产BI行业唯一获奖品牌。据了解&#x…

scrapy爬虫框架

scrapy爬虫框架一 scrapy架构介绍二 安装指南三 创建项目3.1 创建爬虫项目3.2 创建爬虫3.3 启动爬虫3.4 pycharm中运行四 scrapy解析数据五 settings相关配置六 持久化方案七 全站爬取cnblogs文章八 中间件一 scrapy架构介绍 Scrapy一个开源和协作的框架,其最初是为…

在线购物电商网站毕业设计,网上购物商城系统设计与实现,毕业设计怎么写论文毕设源码开题报告需求分析怎么做

项目背景和意义 目的:伴随着互联网技术的不断发展和完善,在人们的生活和工作的各个方面,互联网都有着非常重大的影响。伴随着国内电子商务行业的迅猛发展,消费者现在能够轻松的实现足不出户的,仅仅通过网络购物平台就可…

【工作经历分享】软件测试求职真的难,但是我还是从7K涨到了14K

上个礼拜刚好转正了,三个月试用期,五月份换的工作。 现在这份工作,相比上一份确实好很多,比如工资直接涨了一倍,7到14,13薪,朝九晚六,从不加班,项目也简单,包…

Kubernetes基础概念

什么是Kubernetes 1.用于自动部署、扩展和管理“容器化( containerized) 应用程序”的开源系统 2.可以理解成K8S是负责自动化运维管理多个容器化程序(比如Docker)的集群,是–个生态极其丰富的容器编排框架工具 Kubernetes作用 1.用于自动部署、扩展和管理“容器化…

2022下半年的软考成绩公布时间?

今年软考下半年成绩公布时间预估在12月15-20日左右。 软考成绩一般并没有一个固定的时间点公布,不过从近几年软考办成绩查询通知公布时间来看,大多是下午出的成绩。一般来说,成绩查询通知公布之前的几分钟,考生已经可以查成绩了。…

使用Golang语言walk框架开发一个简单的windowsGUI

1、前言 最近使用golang语言开发了一个windowsGUI的Demo,由于golang语言属于比较新的语言,对GUI开发这一块并没有原生库也没有推荐库,因此我在github上找到了一个叫做walk的GUI开发框架。 github原址为:http://github.com/lxn/w…

定时执行专家 —— 定时循环发送TCP消息(例如:控制设备的开关机等场景)

《定时执行专家》是一款制作精良、功能强大、简单易用、毫秒级精度、专业级的定时任务执行软件。软件具有 21 种【任务类型】、12 种【触发器】触发方式,并且全面支持界面化Cron表达式设置。软件采用多线程并发方式检测任务触发和任务执行,能够达到毫秒级…

带你快速入门JDBC

1,JDBC概述 在开发中我们使用的是java语言,那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称:( Java DataBase Connectivity ) Java 数据库连接 …

Win11的两个实用技巧系列之开机后桌面无响应怎么办?

目录 win10开机后桌面无响应怎么办?win10开机后桌面无响应点什么都不行 win10开机后桌面无响应点什么都不行怎么办? Win10和Win11 22H2如何关闭文字热门搜索? Win11 22H2关闭文字热门搜索 Win10 22H2关闭文字热门搜索 点击拿去 win10开机后桌面无响应怎么办…

NR PUSCH power control

这篇看下NR PUSCH power control的相关内容,主要内容集中在38.213 7.1章节,功率计算无非就是一个长公式,根据RRC配置的参数及后续DCI field 的内容作出功率的调整;最初这部分看的就云里雾里的,最近再看,相比…

环境土壤物理模型HYDRUS

HYDRUS是由著名土壤学家Rien van Genuchten和Jirka Simunek等人基于Windows系统界面开发的环境土壤物理模拟软件,是模拟一维和多维变饱和多孔介质的水流、溶质运移、根系吸水和溶质吸收、热量传输等的强有力工具。除基础功能以外,该模型还附有一系列扩展…

交叉验证、网格搜索、模型选择与调优、鸢尾花案例增加K值调优与Facebook人造世界签到位置train.csv数据预测代码实现

一、交叉验证 交叉验证(cross validation):将拿到的训练数据分为训练和验证集,以下图为例,将数据分成4份,其中一份作为验证集,经过4次(组)的测试,每次都更换不同的验证集,即得到4组模型的结果&…

One-shot就能做事件抽取?ChatGPT在信息抽取上的强大应用

One-shot就能做事件抽取?ChatGPT在信息抽取上的强大应用0. 前言1. 灵感2. 实验3. 结论0. 前言 近期,OpenAI发布的chat GPT可谓是各种刷屏,很多人都在关注这种模式是否可以应用于搜索引擎,这给做搜索的朋友们带来了很大的危机感。…

强大的VS插件DevExpress CodeRush v22.1 - 让代码编程更智能

DevExpress CodeRush是一个强大的Visual Studio .NET 插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验。为Visual Studio IDE增压、消除重复的代码并提高代码质量,可以快速思考、自动化测试、可视化调试和重构。 CodeRush v2…

vue学习笔记(一)-vue基础语法

视频教程:尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通_哔哩哔哩_bilibili 相关文档:Vue核心 Vue简介 初识 (yuque.com) 兼容性 Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAS…

RabbitMQ入门

1. 什么是MQ 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已 作用:应用程序“对”应用程序的通信方法。 2. 应用场景 主要解决异步处理…

pixel 3xl 手机如何烧录自己编译的android 12代码

pixel 3xl 手机如何烧录自己编译的android 12代码 一.查看pixel 3xl手机支持的Android 12版本 通过浏览器访问android版本跟代号网页查看对应的pixel 3XL 手机支持的android 版本跟代号 可以看出,pixel 3XL手机支持Adnroid 12的有Android 12.0.0_r31, Android 12.…

华为机试 - 区间交叠问题

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 给定坐标轴上的一组线段,线段的起点和终点均为整数并且长度不小于1,请你从中找到最少数量的线段,这些线段可以覆盖柱所有线段。 输入描述 第一行输入为所有线段的数…

键盘输入保护器:KeyScrambler

创新技术屏蔽数字资产 KeyScrambler 开创性的击键加密技术可在 Windows 操作系统、所有浏览器和数百个关键应用程序中实时深入地保护用户键入的信息。 值得信赖的软件让用户安心 KeyScrambler 已经被世界各地的专家、博主和用户测试和使用了 16 年,并被证明对最阴险…