标签:XML 结构 code 设计原则 方案 encoding 基类 lazy 展示
我们在使用python的flask框架时,可能会经常用到生命周期函数如:before_request, before_first_request,或者信号等,刚开始学的时候就想只要写一个函数,然后加上一个装饰器居然就可以实现这种开挂般的效果,那时感觉这框架代码写得真棒, 再过些时间自己学会阅读框架源码时,在flask源码中的wsgi_app函数里面发现了奥秘,原来是这样写就能实现插入生命周期的效果啊,时间在走知识在涨,不知不觉走进了设计模式的天堂,再猛然看flask框架源码的时候就觉得,原来如此,这不就是模版方法设计模式的具体应用吗?接下来我们来看看什么是模版方法设计模式来揭开它的神秘面纱。
模版方法设计模式GOF官方的解释是: 定义一个操作中的算法的骨架(稳定), 而将一些步骤(变化)延迟到子类中。 使得子类可以不改变(复用)一个算法的结构即可重定义该算法的某些特定步骤。
模版方法设计模式的框架图如下:
可以看到在抽象类中定义了一系列固定流程的方法, 而在子类中去重写或者实现具体的某些步骤。
接下来我们用丐版的Flask来演示模版方法设计模式的精髓,声明flask框架并不是这样实现的,只是含有模版设计模式的思想, 我们的演示只是把这思想展示出来。
class Flask: def before_request(self): pass def request(self): pass def context(self): print("我在存储上下文") def response(self): pass def clear(self): print("我在清除上下文") class Application(Flask): def before_request(self): print("我在煮饭前加了一个蛋") def request(self): print("我正在吃饭") def response(self): print("终于吃好了") def run(self): self.before_request() self.request() self.context() self.request() self.clear() Application().run()
我们发现,run方法执行的步骤是固定的,这样每个app继承Flask的时候都要实现一个run方法,加重了app开发者的负担,因为run主程序的步骤是固定的,我们把run方法的实现移到抽象类Flask中,看一下效果。
class Flask: def before_request(self): pass def request(self): pass def context(self): print("我在存储上下文") def response(self): pass def clear(self): print("我在清除上下文") def run(self): self.before_request() self.request() self.context() self.request() self.clear() class Application(Flask): def before_request(self): print("我在煮饭前加了一个蛋") def request(self): print("我正在吃饭") def response(self): print("终于吃好了") Application().run()
这里我们就是把主程序run方法移动到抽象类Flask中,这时作为我们开发者,我们只要实现具体的步骤如,before_request和request等就可以了,这样大大减轻了开发者负担。
在构建过程中,对于某一项任务,它通常有稳定的整体操作结构, 但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。在这个时候模版方法设计模式将会是你很好的一个选择。
模版方法设计模式是一种非常基础性的设计模式, 在面向对象系统中有大量的应用。它用最简洁的机制(多态)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
除了可以灵活应对子步骤的变化外, “不要调用我, 让我来调用你”的反向控制结构是模版方法设计模式的典型应用。
最后还是奉上设计模式的8大基本设计原则:
标签:XML 结构 code 设计原则 方案 encoding 基类 lazy 展示
原文地址:https://www.cnblogs.com/lifei01/p/13213473.html