zoukankan      html  css  js  c++  java
  • 《Fluent Python》 CH.06_函数_使用一等函数实现设计模式 (函数式策略模式+命令模式)

    6.1 案例分析:重构“策略”模式

    uml:

    经典的“策略”模式

    使用类+继承同一接口的方式来实现的,实现不同算法的组件共同的接口。

    调用时如何使策略生效:

    • new一个指定的子类类型并传入接口中
    • 在接口内部自己判断并实例化

    示例 6-1 的部分代码:

    from abc import ABC, abstractmethod
    class Promotion(ABC) : # 策略:抽象基类
        @abstractmethod
        def discount(self, order):
            """返回折扣金额(正值)"""
    
    

    6.1.2 使用函数实现“策略”模式

    示例 6-3 是对示例 6-1 的重构,把具体策略换成了简单的函数,而且去掉了 Promo 抽象类。

    同时,没必要在新建订单时实例化新的促销对象,函 数拿来即用

    6.2 “命令”模式 (包装器模式)

    “命令”设计模式也可以通过把函数作为参数传递而简化。这一模式对类 的编排如图 6-2 所示。

    菜鸟教程:意图是将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

    uml:

    示例 6-9 MacroCommand 的各个实例都在内部存储着命令列表

    class MacroCommand:
        """一个执行一组命令的命令"""
        def __init__(self, commands):
            self.commands = list(commands)
        def __call__(self):
            for command in self.commands:
                command()
    
    

    小结

    使用一等函数对“命令”模式的重新审视到此结束。站在一定高度上看, 这里采用的方式与“策略”模式所用的类似:把实现单方法接口的类的实 例替换成可调用对象。

    毕竟,每个 Python 可调用对象都实现了单方法接口,这个方法就是 call

    你不逼自己一把,你永远都不知道自己有多优秀!只有经历了一些事,你才会懂得好好珍惜眼前的时光!
  • 相关阅读:
    使用云(BAE)实现android应用数据的远程存取(MySQL)
    VI键盘图
    IOS 6 UIActivityViewController详解 社交分享
    IOS 计算字体控件盖度, 设置粗体+阴影
    myeclipse中tomcat 7.0 关于64位与32位的冲突问题 ( tcnative1.dll )
    九度OJ 1001 A+B for Matrices
    网站10大常见安全漏洞及解决方案
    js网页如何获取手机屏幕宽度
    常用正则说明
    php中的线程、进程和并发区别
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/14396980.html
Copyright © 2011-2022 走看看