只要五分钟,带你学会策略模式
大家好,今天给大家介绍一个新的设计模式——策略模式。
策略模式的内容非常简单,五分钟就可以学会。严格来说,这既可以当做是一种设计模式,也可以当做是一种函数式编程的思想。
函数式编程
我们之前在介绍Python的语言特性的时候,曾经提到过函数式编程。所谓的函数式编程,也就是说我们可以把函数也看成是变成,进行传参以及拷贝或者是赋值。
听起来这个概念好像很黑科技,但实际上它由来很久,在C语言当中就有指向函数的指针,其实也是非常类似的概念。在Python当中最常用的把函数当做参数的例子应该就是lambda函数了。我们经常使用lambda函数来充当各种临时用途。
arr = [3, 4, 5]
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的重要特性,希望大家都能通过这个设计模式学会它、熟悉它。
相关文章
- 前端性能监控及推荐几个开源的监控系统
web项目性能很重要,开发迭代过程中难免会有所忽视,性能会伴随产品的迭代而有所衰减。特别在移动端,网络一直是一个很大的瓶颈,而页面却越来越大,功能越来越复杂。并没有简单的几条黄金规则就可以搞定性能优化工作,我们需要一套性能监控系统持续监控、评估、预警页面性能状况、发现瓶颈,指导优化工作的进行。
- 5大Node.js框架,谁才是Node.js最佳框架?
首先,框架的目的是帮助你在从头开始构建web应用程序时克服一些常见的开发挑战。在为自己选择Node.js框架之前应考虑哪些事项?为了帮助你回答这个问题,今天,我将介绍5个最佳的Node.js框架。
- 只要五分钟,带你学会策略模式
大家好,今天给大家介绍一个新的设计模式——策略模式。
- 使用V8和node轻松profile分析nodejs应用程序
我们使用nodejs写好了程序之后,要是想对该程序进行性能分析的话,就需要用到profile工具了。
- 关于在移动端避免使用100vh的原因及解决方案
CSS中的Viewport单元听起来很棒。如果你想将一个元素设置成全屏高度,你可以设置高度:100vh,这样你就有了一个完美的全屏元素,它会随着视口的改变而改变大小!遗憾的是,事实并非如此。100vh在不同的浏览器的实现方式上也有一点微妙的变化,这使得它几乎毫无用处。最好避免100vh,而是依赖javascript来设置高度,以获得完整的视口体验。
随机推荐
- 前端性能监控及推荐几个开源的监控系统
web项目性能很重要,开发迭代过程中难免会有所忽视,性能会伴随产品的迭代而有所衰减。特别在移动端,网络一直是一个很大的瓶颈,而页面却越来越大,功能越来越复杂。并没有简单的几条黄金规则就可以搞定性能优化工作,我们需要一套性能监控系统持续监控、评估、预警页面性能状况、发现瓶颈,指导优化工作的进行。
- 5大Node.js框架,谁才是Node.js最佳框架?
首先,框架的目的是帮助你在从头开始构建web应用程序时克服一些常见的开发挑战。在为自己选择Node.js框架之前应考虑哪些事项?为了帮助你回答这个问题,今天,我将介绍5个最佳的Node.js框架。
- 只要五分钟,带你学会策略模式
大家好,今天给大家介绍一个新的设计模式——策略模式。
- 使用V8和node轻松profile分析nodejs应用程序
我们使用nodejs写好了程序之后,要是想对该程序进行性能分析的话,就需要用到profile工具了。
- 关于在移动端避免使用100vh的原因及解决方案
CSS中的Viewport单元听起来很棒。如果你想将一个元素设置成全屏高度,你可以设置高度:100vh,这样你就有了一个完美的全屏元素,它会随着视口的改变而改变大小!遗憾的是,事实并非如此。100vh在不同的浏览器的实现方式上也有一点微妙的变化,这使得它几乎毫无用处。最好避免100vh,而是依赖javascript来设置高度,以获得完整的视口体验。