使用一等函数实现设计模式

中文电子书P278

合理利用作为一等对象的函数,把模式中涉及的某些类的实例替换成简单的函数,从而简化代码。

1. 重构“策略”模式

  1. 中文电子书P282
  2. Python3.0-3.3中,声明抽象基类要使用metaclass=关键字:class Promotion(metaclass=ABCMeta)。在Python3.4中,最简单的方法是子类化abc.ABC。
from abc import ABC, abstractmethod

class Promotion(ABC):
@abstractmethod
def discount(self, order):
""""""

3. 具体策略用Order类实现,且有Promotion抽象基类

  1. 中文电子书P282,促销事例。

4. 具体策略用简单的函数替换,并且去掉Promotion抽象基类

  1. 原因:每个具体策略都是一个类,但只定义了一个方法,且没有实例属性(状态)。他们看起来是普通的函数。
  2. 中文电子书P285。

5. 寻找最优折扣额度

  1. 方法1. hardcode,写死在一个列表里,缺点是新增具体折扣策略要手动添加。
promos = [promo1, promo2, promo3]

def best_promo(order):
"""选择最佳折扣"""
return max(promo(order) for promo in promos)
  1. 方法2. 用内置函数globals()找出模块中的全部策略。
#globals()以字典形式返回的是当前的全局符号表。globals()[name]返回的是方法的地址addr, 即globals()[name]()可以调用函数。
#过滤掉best_promo自身,防止无限递归。
promos = [globals()[name] for name in globals() if name.endswith('_promo') and name != 'best_promo']
  1. 方法3. 在一个单独的模块中保存所有策略函数,把best_promo排除在外
#用inspect模块内省promotions模块
import inspect
import promotions
#inspect.getmembers()返回的是元列表,如下所示
'''[('a_pro', <function a_pro at 0x7fec13d3d840>), ('b_pro', <function b_pro at 0x7fec13d3d8c8>), ('c_pro', <function c_pro at 0x7fec13d3d950>)]'''
promos = [func for name, func in inspect.getmembers(promotions, inspect.isfunction)]

但是这个例子是在promotions模块里都是包含能计算折扣的函数的假设上进行的。不是一个完善的方案,而是inspect(内省)的一种用途。

  1. 第7章会使用函数装饰器去实现这个电商“策略”模式示例。

6. 命令模式通常也用单方法类实现,同样也可以换成普通的函数(或者可调用对象)。

中文电子书P292

7. 模式或API可以使用一等函数或可调用对象实现,减少样板代码。

8. 设计模式与语言特性无法精确对应。

23个经典的设计模式很好用Java实现,不意味着所有模式都能一成不变地在所有语言中使用。

最新文章

  1. iOS—图片编辑,文字下落动画的Demo
  2. 使用Discuz关键词服务器实现PHP中文分词
  3. css3学习总结2--CSS3圆角边框
  4. HtmlHelper—DropDownList:SelectList、SelectListItem
  5. Zabbix源码包安装
  6. win10 TortoiseSVN 部分图标不显示
  7. 必须得是一万小时的 刻意训练(deliberate practice)
  8. JavaSE_ IO流 总目录(19~22)
  9. html5的自定义data-*属性和jquery的data()方法的使用
  10. 【翻译】Ext JS最新技巧——2014-10-30
  11. mysql ++中文乱码问题
  12. LESS的简单介绍
  13. Android--操作图片Exif信息
  14. 转载, sublime text3 input函数无法执行问题解决方法
  15. Docker 容器操作命令
  16. 2019-04(2)Python学习
  17. 脚手架vue-cli系列五:基于Nightwatch的端到端测试环境
  18. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(六):集成 Swagger API
  19. Oracle 12c Windows安装、介绍及简单使用(图文)
  20. css网页布局 --- 左边固定,右边自适应

热门文章

  1. HTML文字标签
  2. ORM表单操作
  3. DBContext基础查询
  4. 2.11 webdriver中使用 FileUtils ()
  5. Nginx中常见问题与错误处理
  6. 问题 B: 奇怪的电梯
  7. Go_MySQL查询插入删除
  8. HTML学习(16)颜色
  9. IntelliJ IDEA 2017.3尚硅谷-----滚轮修改字体大小
  10. 快递查询API