百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

只要五分钟,带你学会策略模式(策略模式主要包括哪些角色)

itomcoil 2025-05-03 14:46 20 浏览

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

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

函数式编程

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

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

本文始发于公众号:TechFlow,求个关注

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...