Python与设计模式--模板模式

23种计模式之 前言 +(5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、+(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、+(11)策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 + 设计原则

16-Python与设计模式–模板模式

一、股票查询客户端

投资股票是种常见的理财方式,我国股民越来越多,实时查询股票的需求也越来越大。
今天,我们通过一个简单的股票查询客户端来认识一种简单的设计模式:模板模式。
根据股票代码来查询股价分为如下几个步骤:登录、设置股票代码、查询、展示。

构造如下的虚拟股票查询器:

class StockQueryDevice():stock_code="0"stock_price=0.0def login(self,usr,pwd):passdef setCode(self,code):self.stock_code=codedef queryPrice(self):passdef showPrice(self):pass

现在查询机构很多,我们可以根据不同的查询机构和查询方式,
来通过继承的方式实现其对应的股票查询器类。

例如,WebA和WebB的查询器类可以构造如下:

class WebAStockQueryDevice(StockQueryDevice):def login(self,usr,pwd):if usr=="myStockA" and pwd=="myPwdA":print "Web A:Login OK... user:%s pwd:%s"%(usr,pwd)return Trueelse:print "Web A:Login ERROR... user:%s pwd:%s"%(usr,pwd)return Falsedef queryPrice(self):print "Web A Querying...code:%s "%self.stock_codeself.stock_price=20.00def showPrice(self):print "Web A Stock Price...code:%s price:%s"%(self.stock_code,self.stock_price)
class WebBStockQueryDevice(StockQueryDevice):def login(self,usr,pwd):if usr=="myStockB" and pwd=="myPwdB":print "Web B:Login OK... user:%s pwd:%s"%(usr,pwd)return Trueelse:print "Web B:Login ERROR... user:%s pwd:%s"%(usr,pwd)return Falsedef queryPrice(self):print "Web B Querying...code:%s "%self.stock_codeself.stock_price=30.00def showPrice(self):print "Web B Stock Price...code:%s price:%s"%(self.stock_code,self.stock_price)

在场景中,想要在网站A上查询股票,需要进行如下操作:

if  __name__=="__main__":web_a_query_dev=WebAStockQueryDevice()web_a_query_dev.login("myStockA","myPwdA")web_a_query_dev.setCode("12345")web_a_query_dev.queryPrice()web_a_query_dev.showPrice()

打印结果如下:

Web A:Login OK… user:myStockA pwd:myPwdA Web A Querying…code:12345
Web A Stock Price…code:12345 price:20.0

每次操作,都会调用登录,设置代码,查询,展示这几步,是不是有些繁琐?
既然有些繁琐,何不将这几步过程封装成一个接口。由于各个子类中的操作过程基本满足这个流程,

所以这个方法可以写在父类中:

class StockQueryDevice():stock_code="0"stock_price=0.0def login(self,usr,pwd):passdef setCode(self,code):self.stock_code=codedef queryPrice(self):passdef showPrice(self):passdef operateQuery(self,usr,pwd,code):self.login(usr,pwd)self.setCode(code)self.queryPrice()self.showPrice()return True

这样,在业务场景中,就可以通过operateQuery一气呵成了。

if  __name__=="__main__":web_a_query_dev=WebAStockQueryDevice()web_a_query_dev.operateQuery("myStockA","myPwdA","12345")

这种基本每个程序员都会想到的解决方案,就是模板模式。很简单吧。
但也许你会问,登录并不一定每次都会成功呀?是的,所以在operateQuery接口中需要做一重判断,

写成:

def operateQuery(self,usr,pwd,code):if not self.login(usr,pwd):return Falseself.setCode(code)self.queryPrice()self.showPrice()return True

在模板模式中,像这样类似于login等根据特定情况,定制某些特定动作的函数,被称作钩子函数。 此例中,如果登录失败(user:myStock B,pwd:myPwdA),会打印如下结果:

Web A:Login ERROR… user:myStockB pwd:myPwdA

二、模板模式

模板模式定义如下:定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个
算法的结构即可重新定义该算法的某些特定的步骤。子类实现的具体方法叫作基本方法,
实现对基本方法高度的框架方法,叫作模板方法。

三、模板模式的优点和应用

优点:
1、可变的部分可以充分扩展,不变的步骤可以充分封装;
2、提取公共代码,减少冗余代码,便于维护;
3、具体过程可以定制,总体流程方便掌控。使用场景:
1、某超类的子类中有公有的方法,并且逻辑基本相同,可以使用模板模式。必要时可以使用钩子方法约束其行为。具体如本节例子;
2、比较复杂的算法,可以把核心算法提取出来,周边功能在子类中实现。例如,机器学习中的监督学习算法有很多,如决策树、KNN、SVM等,但机器学习的流程大致相同,都包含输入样本、拟合(fit)、预测等过程,这样就可以把这些过程提取出来,构造模板方法,并通过钩子方法控制流程。

四、模板模式的缺点

1、模板模式在抽象类中定义了子类的方法,即子类对父类产生了影响,部分影响了代码的可读性。

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

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

相关文章

java 鸿鹄云商 SAAS云产品概述 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城免费搭建

【SAAS云平台】打造全行业全渠道全场景的SaaS产品,为店铺经营场景提供一体化解决方案;门店经营区域化、网店经营一体化,本地化、全方位、一站式服务,为多门店提供统一运营解决方案;提供丰富多样的营销玩法覆盖所有经营…

一秒开挂!纯 Python 开发 Web 应用

你好,我是 EarlGrey,喜欢翻译点东西,偶尔写写代码。 点击下方卡片关注我,一起向上进击,提升自我。后台回复关键词“电子书”,送你一份我收藏的电子书合集。 PyWebIO 是一个用于构建交互式 Web 应用程序的 P…

漫动作杂志漫动作杂志社漫动作编辑部2023年第10期目录

漫步艺海 钟日恒作品欣赏 (0001) 钟日恒 白建宁作品欣赏 (0003) 白建宁 史君仪作品欣赏 (0006) 史君仪 黄韬、时钺博作品欣赏 (0007) 黄韬;时钺博 刘合栋、方晓玲作品欣赏 (0008) 刘合栋;方晓玲 宗家禾作品欣赏 (0009) 宗家禾 漫游美术《漫动作》投稿&…

API网关

API网关的作用 下图显示了详细信息。 步骤 1 - 客户端向 API 网关发送 HTTP 请求。 步骤 2 - API 网关解析并验证 HTTP 请求中的属性。 步骤 3 - API 网关执行允许列表/拒绝列表检查。 步骤 4 - API 网关与身份提供商对话以进行身份​​验证和授权。 步骤 5 - 将速率限制规…

蓝桥杯第一天-----时间显示

文章目录 前言一、题目描述二、测试用例三、题目分析四、具体代码实现总结 前言 本章中将相信介绍蓝桥杯中关于时间显示的题目。 链接:https://www.lanqiao.cn/problems/1452/learning/ 一、题目描述 二、测试用例 三、题目分析 1.输入的时间为毫秒,毫…

大数据学习(26)-spark SQL核心总结

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…

浅析linux中的信号

人们往往将信号称为“软件中断”,它提供了异步事件的处理机制,这些事件可以来自系统外部(如用户按下ctrlc产生中断符),也可能来自程序或者内核内部的执行动作(如进程除零操作)。进程收到信号&am…

AcWing 2816. 判断子序列

文章目录 AcWing 2816. 判断子序列我的思路CODE 欣赏大神代码给点思考 AcWing 2816. 判断子序列 题目链接:https://www.acwing.com/activity/content/problem/content/2981/ 我的思路 直接硬套模版,把两个指针两层循环写上如果匹配,记录数组…

汽车内饰灯不亮问题修复

车内饰灯不亮问题修复 最近换后座阅读灯火光闪了一下,保险丝短路,导致车内所有灯光,包括前后座阅读灯、后备箱灯都不亮了。 因为是所有灯都不亮,所以排除灯泡问题,网上查了下大概率是保险丝烧了。于是查了自己更换保…

idea下载与安装,以及创建一个项目写HelloWorld

1.idea下载 Download IntelliJ IDEA – The Leading Java and Kotlin IDE (jetbrains.com) Ultimate为旗舰版,功能全面,插件丰富,按年收费。 Community为社区版,免费试用,功能相对而言不是很丰富,但是不影…

windows 映射 webdav 为本地磁盘

参考 https://docs.qnap.com/operating-system/qts/4.5.x/zh-cn/GUID-31D5B05F-F29E-4D61-9758-C8CF839C14FD.html WebDAV 允许用户访问和管理远程服务器上的文件。您可以通过 WebDAV 将 Windows 计算机上的共享文件夹装载为网络磁盘。 在 Windows 计算机上,打开“…

Linux系统---环境变量+内核进程调度队列(选学)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 键盘敲烂,年薪百万! 一、环境变量 1.基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如: 我们在编写CI/…

Python 分解IP段获取所有IP(子网掩码)

需求 192.168.1.0/24,192.168.2.1-192.168.2.254,192.168.3.3 IP段格式已 "," 分割,获取所有IP 注意 1. 判断 IP 是否合规 2. 去除多余的字符,例如空格、换行符 3. 去重 代码 import re import ipaddressdef isIP(ip):p re.compile(^((…

JS调用Android原生相机设置

1、定义 private ValueCallback<Uri> mUploadMessage;public ValueCallback<Uri[]> uploadMessage;private Uri imageUri; 2、webview 设置 webView.setWebChromeClient(new WebChromeClient(){// For 3.0 Devices (Start)// onActivityResult attached before co…

谷歌要如何优化引流?谷歌引流有什么优势?

在谷歌引流上想要写出高质量的内容是不言而喻的&#xff0c;但如果你希望为关键字排名&#xff0c;那么写高质量的内容是很重要的。如果没有人发现你的内容有用&#xff0c;那么世界上所有的页面优化都不会对你有帮助。谷歌有很多排名因素&#xff0c;可以帮助他们决定你的页面…

考虑区域多能源系统集群协同优化的联合需求侧响应模型程序代码!

本程序参考中国电机工程学报论文《考虑区域多能源系统集群协同优化的联合需求侧响应模型》&#xff0c;文章使用关系矩阵来表示电、热、气的耦合关系&#xff0c;使用NSGA2方法对多目标优化方法进行求解&#xff0c;文章中考虑环境因素是目前研究的热点。程序中算例丰富&#x…

对支付宝进行测试用例分析

支付宝作为一款广泛使用的支付工具&#xff0c;其功能和性能的稳定性和可靠性对于用户体验至关重要。因此&#xff0c;对其进行测试用例分析是非常必要的。以下是一些可能的测试用例&#xff1a; 功能测试&#xff1a;测试支付宝各项功能的完整性和正确性&#xff0c;例如转账、…

LINUX入门篇【11】---进程篇【3】---进程优先级,进程切换,进程调度

前言&#xff1a; 有了前面知识点的铺垫&#xff0c;本篇我们将围绕进程的三个方面来展开&#xff0c;即进程优先级&#xff0c;进程切换以及进程调度的问题&#xff0c;这里的进程调度其实本质就是CPU是如何去调度进程的。 进程优先级&#xff1a; 优先级的概念&#xff1a…

[Linux ] sed文本处理和免交互

一、sed 1.1 sed是什么 sed 是一种流编辑器&#xff08;stream editor&#xff09;&#xff0c;用于对文本数据进行文本转换和处理。它通常被用于在命令行中执行文本编辑任务&#xff0c;可以对输入的文本进行搜索、替换、删除等操作&#xff0c;并将结果输出。sed 是一个非交…

maven repository的官方网址

1.maven仓库官方地址&#xff1a; https://mvnrepository.com/