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、模板模式在抽象类中定义了子类的方法,即子类对父类产生了影响,部分影响了代码的可读性。
相关文章:
Python与设计模式--模板模式
23种计模式之 前言 (5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、(11)策略模式、责任链模式、命令模式、中介者模…...
LoadRunner自动化测试工具的应用
目录 第一部分:Loadrunner的简介 1.1 安装注意事项 1.2 协议的选择或者 VUSER 类型的选取 1.3 LR 的基本原理 1.4 测试脚本录制/分配所遵循的几个原则 第二部分:录制脚本 2.1 录制脚本前需要理解的几个基本概念 2.1.1 事务(Transaction) 2.1.2 集合点(Rendezvous) 2.1…...
工厂模式是一种创建对象的设计模式,使用工厂类来创建对象,而不是直接使用 new 关键字来创建对象。
文章目录 示例代码virtual std::string Operation() const = 0;如何理解std::string Operation() const override {这句如何理解?Factory 类包含一个静态方法 CreateProduct,它根据传入的类型参数来创建并返回具体的产品实例。这句话理解?std::unique_ptr<Product> pr…...
NET MVC中使用Element-Plus框架编写组件
一、目的 在NET MVC中使用Element-Plus编写可重复使用的组件。 二、准备工作 2.1 NET MVC项目 2.2 MVC项目中使用Element-Plus框架。不熟悉的可以参考此文章: NET MVC中如何使用Element-Plus-CSDN博客 三、组件编写 3.1、新建一个MVC的部分视图页面ÿ…...
在线文库系统 转码功能源代码展示 支持文档在线预览查阅功能
1、支持 pdf,doc,docx,ppt,pptx,txt,xlsx,xls,csv,zip,epub,ai,psd 格式的文件 2、文库系统的上传界面,用户可以进行上传自己的文件,然后自定义文档售价,来赚取金额。 3、文库系统的部分代码披露: <template><div clas…...
Linux /etc/shadow密码生成操作示例
一. 前言 之前学习过Linux文件系统下/etc/shadow里面保存着各个用户名的密码,并且密码是通过MD5算法加盐的方式生成的。但是一直没有自己真正动手生成过,今天,就来自己动手写代码生成下。 二. 代码验证/etc/shadow中密码 1. 通过passwd命令生…...
seata集成springboot的一些错误小计
1 seata依赖没找到 dependencies.dependency.version for com.alibaba.cloud:spring-cloud-starter-alibaba-seata:jar is missing. line 126, column 21错误原因:未指定具体的seata版本 解决 <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-st…...
springmvc(基础学习整合)
SpringMVC是Spring框架提供的构建Web应用程序的全功能MVC模块。 在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。 springMVC基本介绍: http://t.csdnimg.cn/TOzw9 MVC是一种设计思想,将一个应…...
采集软件大全-全网免费的采集软件大全
采集软件大揭秘:从排名到任意网站采集的全方位解读 在数字时代,信息是黄金,而采集软件就是那把能够淘金的工具。无论是市场调研、竞品分析还是SEO优化,采集软件都扮演着不可或缺的角色。在这个领域里,有许多选择&…...
世微AP5125 DC-DC降压恒流 LED车灯电源驱动IC SOT23-6
产品描述 AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器,适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定频率 140kHz 的 PWM 工作模式, 利用平均电流检测模式,因此具有优异的负载调整 率…...
STC15-串口通信打印输出数据printf函数与sprintf函数
STC15-串口通信打印输出数据printf函数与sprintf函数 1.打印输出数据有二种printf函数与sprintf函数,不同之处有:(1)函数的声明不同(2)函数的功能不同(3)用法举例 该问题引用百度知道…...
Android 11.0 默认开启USB调试功能
Android 11.0 默认开启USB调试功能 近来收到项目反馈需求想要默认开启USB调试功能,默认开启USB调试功能主要是在UsbDebuggingActivity.java文件中实现,具体修改参照如下: /vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/and…...
单片机AVR单片机病房控制系统设计+源程序
一、系统方案 设计一个可容8张床位的病房呼叫系统。要求每个床位都有一个按钮,当患者需要呼叫护士时,按下按钮,此时护士值班室内的呼叫系统板上显示该患者的床位号,并蜂鸣器报警。当护士按下“响应”键时,结束当前呼叫…...
C语言——多种方式打印出1000之内的所有的“水仙花数”
所谓水仙花数,是指一个3位数,其各位数字立方和等于该数本身。水仙花数是指一个三位数,它的每个位上的数字的立方和等于它本身。例如,153是一个水仙花数,因为1^3 5^3 3^3 153。 方法一 #define _CRT_SECURE_NO_WARNINGS 1#include <std…...
.net 8 发布了,试下微软最近强推的MAUI
先看下实现的效果: 下面发下XAML文件: <?xml version"1.0" encoding"utf-8" ?> <ContentPage xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x"http://schemas.microsoft.com/winfx/2009/…...
【产品经理】AI在SaaS产品中的应用及挑战
随着ChatGPT大模型在全球的爆火,AI迅速在各个行业内,助力于各行业的效率提升。而SaaS领域,AI同样也大有可为。 AI(人工智能,Artificial Intelligence的缩写)近一年来一直处于舆论风口,随着ChatG…...
Python实现一箭穿心
文章目录 🎄效果🏳️🌈Turtle模块🌹代码🌺代码讲解 🎄效果 🏳️🌈Turtle模块 Turtle是一个绘图工具,是Python标准库中的一个模块。它提供了一种简单而直观的方式来创…...
机器人AGV小车避障传感器测距
一、A22超声波传感器 该模块是基于机器人自动控制应用而设计的超声波避障传感器,针对目前市场上对于超声波传感器模组盲区大、测量角度大、响应时间长、安装适配性差等问题而着重设计。 具备了盲区小、测量角度小、响应时间短、过滤同频干扰、体积小、安装适配性高…...
Boost:进程间共享内存
Linux编程:进程间共享内存_linux 判断共享内存是否存在-CSDN博客 介绍了如何在linux的进程间共享内存。 Boost对共享内存进行了封装,可以更为方便的使用共享内存。 1.创建共享内存 #include <boost/interprocess/shared_memory_object.hpp> using namespace boost::i…...
Android Camera Surface显示相关问题总结
1.默认创建的Preview Surface填充RGBA数据显示异常。 //界面创建的Surface format默认为4(RGB_565),而预览界面所需的格式是RGBA_8888 ANativeWindow_setBuffersGeometry(window, width, height, WINDOW_FORMAT_RGBA_8888); 2.调用ANativeWindow的dequeueBuffer出错ÿ…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
