只要五分钟,带你学会策略模式

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

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

函数式编程

我们之前在介绍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的重要特性,希望大家都能通过这个设计模式学会它、熟悉它。

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

posted @ 2021-02-05 14:08  Coder梁  阅读(629)  评论(0编辑  收藏  举报