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

模板网 2021-02-05

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

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

函数式编程

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

相关文章

  1. 前端性能监控及推荐几个开源的监控系统

    web项目性能很重要,开发迭代过程中难免会有所忽视,性能会伴随产品的迭代而有所衰减。特别在移动端,网络一直是一个很大的瓶颈,而页面却越来越大,功能越来越复杂。并没有简单的几条黄金规则就可以搞定性能优化工作,我们需要一套性能监控系统持续监控、评估、预警页面性能状况、发现瓶颈,指导优化工作的进行。

  2. 5大Node.js框架,谁才是Node.js最佳框架?

    首先,框架的目的是帮助你在从头开始构建web应用程序时克服一些常见的开发挑战。在为自己选择Node.js框架之前应考虑哪些事项?为了帮助你回答这个问题,今天,我将介绍5个最佳的Node.js框架。

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

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

  4. 使用V8和node轻松profile分析nodejs应用程序

    我们使用nodejs写好了程序之后,要是想对该程序进行性能分析的话,就需要用到profile工具了。

  5. 关于在移动端避免使用100vh的原因及解决方案

    CSS中的Viewport单元听起来很棒。如果你想将一个元素设置成全屏高度,你可以设置高度:100vh,这样你就有了一个完美的全屏元素,它会随着视口的改变而改变大小!遗憾的是,事实并非如此。100vh在不同的浏览器的实现方式上也有一点微妙的变化,这使得它几乎毫无用处。最好避免100vh,而是依赖javascript来设置高度,以获得完整的视口体验。

随机推荐

  1. 前端性能监控及推荐几个开源的监控系统

    web项目性能很重要,开发迭代过程中难免会有所忽视,性能会伴随产品的迭代而有所衰减。特别在移动端,网络一直是一个很大的瓶颈,而页面却越来越大,功能越来越复杂。并没有简单的几条黄金规则就可以搞定性能优化工作,我们需要一套性能监控系统持续监控、评估、预警页面性能状况、发现瓶颈,指导优化工作的进行。

  2. 5大Node.js框架,谁才是Node.js最佳框架?

    首先,框架的目的是帮助你在从头开始构建web应用程序时克服一些常见的开发挑战。在为自己选择Node.js框架之前应考虑哪些事项?为了帮助你回答这个问题,今天,我将介绍5个最佳的Node.js框架。

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

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

  4. 使用V8和node轻松profile分析nodejs应用程序

    我们使用nodejs写好了程序之后,要是想对该程序进行性能分析的话,就需要用到profile工具了。

  5. 关于在移动端避免使用100vh的原因及解决方案

    CSS中的Viewport单元听起来很棒。如果你想将一个元素设置成全屏高度,你可以设置高度:100vh,这样你就有了一个完美的全屏元素,它会随着视口的改变而改变大小!遗憾的是,事实并非如此。100vh在不同的浏览器的实现方式上也有一点微妙的变化,这使得它几乎毫无用处。最好避免100vh,而是依赖javascript来设置高度,以获得完整的视口体验。