Python笔记:设计模式之模板方法模式
此模式通过一个模板方法来定义程序的框架或算法,通常模板方法定义在基类中,即原始的模板,然后子类就可以根据不同的需要实现或重写模板方法中的某些算法步骤或者框架的某部分,最后达到使用相同模板实现不同功能的效果。
核心思想:
- 使用一个模板方法定义好总的算法框架。
- 子类中根据需要重新定义某些操作,但是不能修改原始模板方法。
- 在多个算法或框架具有类似或相同的逻辑的时候,可以使用模板方法模式,以实现代码重用。
- 当某些操作是强制子类必须实现的时候,此操作就可以定义为抽象方法,如果不是强制要求子类实现的话,则可以在基类中为它定义一个默认实现。
主要角色:
- 接口:通常是抽象基类,定义模板方法中需要的各项操作。
- 模板方法:即模板算法,定义好各项操作的执行顺序或算法框架。
- 真实对象:子类通过重新实现接口中的各项操作,以便让模板方法实现不同的功能。
优缺点:
- 优点:因为子类的实现是根据基类中的模板而来的,所以可以实现代码重用,因为有时候我们需要修改的只是模板方法中的部分操作而已。
- 缺点:此模式的维护有时候可能会很麻烦,因为模板方法是固定的,一旦模板方法本身有修改的时候,就可能对其他的相关实现造成影响。
模板方法运用案例--钩子
钩子是在基类中声明的方法,并且在模板方法中使用它,通常是给它定义好一个默认的实现,钩子的思想是为子类提供一个按需“钩取”的能力,因此如果子类不想使用钩子,则可以忽略钩子的相关实现。
简单示例:
from abc import ABCMeta, abstractmethod class Template(metaclass=ABCMeta):
"""接口:模板类"""
@abstractmethod
def operation_1(self):
pass @abstractmethod
def operation_2(self):
pass def template_func(self):
"""模板方法:定义好具体的算法步骤或框架"""
self.operation_1()
self.operation_2() class SubObj1(Template):
"""子类1:按需重新定义模板方法中的算法操作"""
def operation_1(self):
print('SubObj1.operation_1()') def operation_2(self):
print('SubObj1.operation_2()') class SubObj2(Template):
"""子类2:按需重新定义模板方法中的算法操作"""
def operation_1(self):
print('SubObj2.operation_1()') def operation_2(self):
print('SubObj2.operation_2()') if __name__ == '__main__':
SubObj1().template_func()
SubObj2().template_func()
Python笔记:设计模式之模板方法模式的更多相关文章
- [python实现设计模式]-2.模板方法模式---把大象关进冰箱.
平时大家上班都很累,为了增加工作中的欢乐气氛,黄页组准备搞个游戏. 游戏的名字是把大象关进冰箱.游戏很简单,需要把指定的物品放进冰箱. 我们都知道,把大象放进冰箱,分3步. 第一步,打开冰箱门,第二步 ...
- Java学习笔记——设计模式之七.模板方法模式
模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构图: 代码: 算法骨架 ...
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- js设计模式——6.模板方法模式与职责链模式
js设计模式——6.模板方法模式与职责链模式 职责链模式
- C#设计模式学习笔记:(13)模板方法模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7837716.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第一个模式--模 ...
- 再起航,我的学习笔记之JavaScript设计模式17(模板方法模式)
模板方法模式 由模板方法模式开始我们正式告别结构型设计模式,开始行为型设计模式的学习分享 行为型设计模式用于不同对象之间职责划分或算法抽象,行为型设计模式不仅仅涉及类和对象,还涉及类或对象之间的交流模 ...
- 设计模式学习笔记——Template Method模板方法模式
可能是最简单的设计模式. 而且你我都用过而不自知. 因为,模板方法模式也者,就是面向对象中的继承.公用部分放在父类,子类继承父类,然后扩展.呵呵.
- python 设计模式之模板方法模式
1.模板方法模式定义 模板模式定义如下:定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤.子类实现的具体方法叫作基本方法,实现对 ...
随机推荐
- 解决tail命令提示“tail: inotify 资源耗尽,无法使用 inotify 机制,回归为 polling 机制”
报错的原因是 inotify 跟踪的文件数量超出了系统设置的上限值,要是这个问题不经常出现可以使用临时解决方法,或者写入配置文件来永久解决. 临时解决方法: # 查看 inotify 的相关配置 $ ...
- 解决root无法登陆
今天重装了一下虚拟机,用filezilla往Linux扔文件需要用root的超级权限,但是却不能建立连接,使用账号密码也无法登录root账户 鼓捣好一阵才知道,因为root权限太高了,可以针对root ...
- maven仓库之第一篇
maven jar仓库 :存放maven项目使用的jar包. 中央仓库,存放99%免费开源项目jar包,apache公司负责维护的,以T为单位的存储. 例如 : struts2-core-2.3.24 ...
- Can not find the tag library descriptor for “http://java.sun.com/jstl/core"
此文原博文地址:https://blog.csdn.net/kolamemo/article/details/51407467 按照查到的资料,JSTL taglib需要jstl.jar来支持.在1. ...
- Python:多态、协议和鸭子类型
多态 问起面向对象的三大特性,几乎每个人都能对答如流:封装.继承.多态.今天我们就要来说一说 Python 中的多态. 所谓多态:就是指一个类实例的相同方法在不同情形有不同表现形式.多态机制使具有不同 ...
- 团队项目之Scrum2
小组:BLACK PANDA 时间:2019.11.17 每天举行站立式会议 提供当天站立式会议照片一张 2 昨天已完成的工作 2 确定用户登录与注册和编辑页面的接口 前端方面:详细确定页面的功能,并 ...
- 安装 openmpi 4.0 用于 horovod 编译
最近编译 horovod框架过程中,需要使用openmpi 4.0但是环境中的openmpi版本比较低,所以在手动安装openmpi4.0 用于编译,下面对过程进行简要记录,进行备忘: curl -O ...
- HTML Rendering Error
刚下载的markdown弹窗提示html渲染错误 去官网 http://markdownpad.com/faq.html#livepreview-directx 页面搜索 This view h ...
- requests乱码问题
有三种方法解决请求后乱码问题. 一:获取二进制数据,再利用str进行编码转换 url='http://music.baidu.com' r = requests.get(url) html=r.con ...
- 查看oracle表空间内存
查看oracle表空间内存 SELECT a.tablespace_name "表空间名", total "表空间大小", free "表空间剩余大小 ...