python设计模式(十四):模板方法模式
定义一个算法或者流程,部分环节设计为外部可变,用类似于模板的思想来实例化一个实体,可以往模板中填充不同的内容;在模板思想下,实体的整体框架是确定的,他是一个模板,但是模板下内容可变,从而实现了动态的更新流程或算法。
示例code:
# encoding=utf-8
"""实现一个客户点单后的处理流程流程"""
class User:
def __init__(self, name, shop, times, number):
self.name = name
self.shop = shop
self.times = times
self.number = number
class Handle:
def __init__(self, user=None):
self.user = user
def Invoicen(self):
"""打印小票"""
string = "打印小票" \
"客户:{}" \
"商品:{}" \
"数量:{}" \
"时间:{}".format(self.user.name, self.user.shop, self.user.number, self.user.times)
print(string)
def Make(self):
"""开始制作"""
print("制作完成:{} 数量:{}".format(self.user.shop, self.user.number))
def run(self):
self.Invoicen()
self.Make()
if __name__ == '__main__':
test = Handle()
xiaoming = User("小明", "汉堡", "17:50", "5")
test.user = xiaoming
test.run()
------------------
打印小票客户:小明商品:汉堡数量:5时间:17:50
制作完成:汉堡 数量:5
看了模板方法后,感觉和之前的一个设计模式比较相似《python设计模式(二):建造者模式》,但是建造者模式是将对象的构建和表示分离,相同的构建生成不同的表示对象,而模板方法是将定义的算法或流程中的部分环节推迟到子类中实现算法或流程的可变,这是二者本质的区别。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python设计模式(十三):解释器模式
此前已经将创造型模式、结构性模式分享了,后面将分享模式设计中的另一种典型模式:行为型模式。 创造型模式是解决实体的生成问题、结构性模式是为了解决实体的组合、搭配问题 ,而行为型设计模式的出现是为了解决不同实体通信的问题。 解释器模式:开发者自定义一种“有内涵”的语言(或者叫字符串),并设定相关的解释规则,输入该字符串后可以输出公认的解释,或者执行程序可以理解的动作。这种模式被用在 SQL 解析、符号处理引擎等 解释器模式要实现两个核心角色: 终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。终结符一半是文法中的运算单元,比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。 非终结符表达式:文法中的每条规则对应于一个非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。 #-*-cod...
- 下一篇
python设计模式(十五):责任链模式
将多个处理方法连接成一条链条,请求将在这条链条上流动直到该链条中有一个节点可以处理该请求;通常这条链条是一个对象包含对另一个对象的引用而形成链条,每个节点有对请求的条件,当不满足条件将传递给下一个节点处理。 示例code: 创建三个不同的对象,每个对象只处理指定范围内的数字,不属于自己的就传递给下一个对象。 classBases: def__init__(self,obj=None): self.obj=obj defscreen(self,number): passclassA(Bases): defscreen(self,number): if200>number>100: print("{}划入A集合".format(number)) else: self.obj.screen(number)classB(Bases): defscreen(self,number): ifnumber>=200: print("{}划入B集合".format(number)) else: self.obj.screen(number)classC(Bases): defscre...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8