zoukankan      html  css  js  c++  java
  • 只要五分钟,带你学会策略模式

    大家好,今天给大家介绍一个新的设计模式——策略模式

    策略模式的内容非常简单,五分钟就可以学会。严格来说,这既可以当做是一种设计模式,也可以当做是一种函数式编程的思想

    函数式编程

    我们之前在介绍Python的语言特性的时候,曾经提到过函数式编程。所谓的函数式编程,也就是说我们可以把函数也看成是变成,进行传参以及拷贝或者是赋值。

    听起来这个概念好像很黑科技,但实际上它由来很久,在C语言当中就有指向函数的指针,其实也是非常类似的概念。在Python当中最常用的把函数当做参数的例子应该就是lambda函数了。我们经常使用lambda函数来充当各种临时用途。

    arr = [345]
    arr = sorted(arr, key=lambda x: -x)

    比如在上面的例子当中我们使用lambda函数来定义了排列的方法,这里的key接受的参数就是一个函数。

    除了排序以及其他操作之外,函数式编程还有一个经典的应用就是今天要说的策略模式。其实策略模式的意义非常简单,和排序是一样的。就是我们固定下来计算的步骤,但是每个步骤的具体操作细节我们不知道,通过函数传入。这样我们传入不同的函数,就可以执行不同的策略

    举个栗子

    我们来举个非常简单的例子,比如说我们现在有一个商品需要进行售卖。比如说有两个售卖场景,一个是聚划算一个是双十一。在这两个场景当中我们的打折力度是不一样的,我们可以把不同的折扣看成是不同的销售策略。

    对于售卖来说,除了打折方式不同之外,其他的所有流程都是一样的。那么我们完全可以把打折单独抽象出来用函数来实现,然后再通过传参的方法传入即可。

    class Order:

        def __init__(self, price, discount_strategy=None):
            self.price = price
            # discount_strategy即使外界传入的打折方法
            self.discount_strategy = discount_strategy

        def price_after_discount(self):
            if self.discount_strategy:
                discount = self.discount_strategy(self)
            else:
                discount = 0
            return self.price - discount

        def __repr__(self):
            fmt = '<Price: {}, price after discount: {}>'
            return fmt.format(self.price, self.price_after_discount())

    我们再来看下实际运行的代码:

    def ten_percent_discount(order):
        return 0.1 * order.price

    def double_eleven_discount(order):
        return 20 + 0.25 * order.price


    if __name__ == '__main__':
        print(Order(100))

        print(Order(100, discount_strategy=ten_percent_discount))

        print(Order(1000, discount_strategy=double_eleven_discount))

    怎么样,是不是非常简单呢?

    其实这里的主要问题不是代码,而是函数式编程的思想。很多人虽然会写Python,但是之前是写Java或者是其他静态类型语言出身,对于Python的一些动态特性没有很好的了解,所以可能意识不到还可以这么玩。

    函数式编程是一个非常好用的东西,也是Python的重要特性,希望大家都能通过这个设计模式学会它、熟悉它。

    今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发

  • 相关阅读:
    在operator =中要处理“自我赋值”
    delete指针以后应赋值为NULL
    【转】C++对成员访问运算符->的重载
    【转】浅析SkipList跳跃表原理及代码实现
    【KakaJSON手册】05_JSON转Model_05_动态模型
    【KakaJSON手册】04_JSON转Model_04_值过滤
    【KakaJSON手册】03_JSON转Model_03_key处理
    【KakaJSON手册】02_JSON转Model_02_数据类型
    【KakaJSON手册】01_JSON转Model_01_基本用法
    利用eclipse调试JDK源码
  • 原文地址:https://www.cnblogs.com/techflow/p/14377394.html
Copyright © 2011-2022 走看看