【Python】策略模式-简介
策略模式Strategy Pattern是 Python 设计模式中非常经典的一种行为型模式。它的核心思想是定义一系列算法或业务逻辑把它们一个个封装起来并使它们可以互相替换。简单来说就是让“做什么”和“怎么做”分离开。下面从“是什么、为什么、怎么用”三个维度为你快速建立一个清晰的认知。1. 现实场景类比秒懂假设你要从杭州去北京策略A坐飞机策略B坐高铁策略C自驾“去北京”这个目标是固定的但“怎么去”是可变的。策略模式就是把“飞机、高铁、自驾”这几种方式封装好让你在出发前根据预算、时间、心情随便切换而不用把“怎么去”的代码全部写在“去北京”这个大函数里面。2. 解决的问题什么时候用如果你在代码中看到大量的if-elif-else或match-case并且每个分支里都是一段独立的业务逻辑那么策略模式就是绝佳的优化手段。它专门解决类臃肿一个类里包含了太多不同行为的变体。条件嵌套过深新增一种算法就得修改原来的代码违反了开闭原则对扩展开放对修改关闭。3. Python 中的经典结构标准三要素标准的策略模式包含三个角色角色作用上下文持有一个策略对象的引用负责调用策略。客户端直接与上下文交互。抽象策略通常是一个接口抽象基类或协议定义所有策略必须实现的方法。具体策略实现抽象策略接口封装具体的算法或逻辑。标准代码骨架类方式fromabcimportABC,abstractmethod# 1. 抽象策略classTransportStrategy(ABC):abstractmethoddeftravel(self,origin,dest):pass# 2. 具体策略AclassAirplaneStrategy(TransportStrategy):deftravel(self,origin,dest):returnf坐飞机从{origin}到{dest}耗时2小时# 3. 具体策略BclassTrainStrategy(TransportStrategy):deftravel(self,origin,dest):returnf坐高铁从{origin}到{dest}耗时5小时# 4. 上下文上下文classTravelPlanner:def__init__(self,strategy:TransportStrategy):self._strategystrategydefset_strategy(self,strategy:TransportStrategy):self._strategystrategydefexecute_travel(self,origin,dest):returnself._strategy.travel(origin,dest)# 使用plannerTravelPlanner(AirplaneStrategy())print(planner.execute_travel(杭州,北京))# 坐飞机...planner.set_strategy(TrainStrategy())print(planner.execute_travel(杭州,北京))# 坐高铁...4. Python 特色函数式策略更 Pythonic 的方式Python 是“一等函数”语言函数本身就是对象。如果策略类只有一个方法没必要为了“类”而写类。直接用函数替换具体策略类代码会极其简洁。# 直接将函数作为策略deftravel_by_air(origin,dest):returnf✈️ 飞机{origin}-{dest}deftravel_by_train(origin,dest):returnf 高铁{origin}-{dest}classTravelPlanner:def__init__(self,strategy_func):self.strategy_funcstrategy_funcdefgo(self,origin,dest):returnself.strategy_func(origin,dest)# 使用plannerTravelPlanner(travel_by_air)planner.go(杭州,北京)5. 策略模式的优缺点优点缺点解耦将算法定义与使用分离修改一个策略不影响其他模块。类数量膨胀如果每种算法都要新建一个类会增加系统复杂度可用函数式方式缓解。符合开闭原则新增策略无需修改上下文和已有策略直接新增即可。客户端必须了解差异客户端需要知道不同策略之间的区别才能选择正确的那个。消除冗长条件语句代码可读性大大提高逻辑清晰。策略间无法共享数据如果策略间有公共的初始化数据需要额外处理。6. 真实世界的经典应用场景电商系统多种优惠券计算满减、折扣、直减。支付模块微信支付、支付宝支付、银行卡支付。数据校验/格式化不同的文件解析器CSV、JSON、XML。排序算法根据数据量选择快速排序、冒泡排序或插入排序。总结策略模式在 Python 中的精髓可以总结为一句话把“变化的部分”封装成接口/函数传递给“不变的部分”。在 Python 中请优先考虑用Callable函数/类实例去实现它这比硬套 Java 的类继承要优雅得多。如果你正在重构复杂逻辑它就是最趁手的工具之一。

相关新闻

知网查重用什么降重工具?按知网适配排一排

知网查重用什么降重工具?按知网适配排一排

知网查重用什么降重工具?按知网适配排一排 你学校要求查知网,这句话其实已经把选降重工具的范围圈死了一大半。很多人吃亏就吃在这:随便找了个降重工具,宣传说降幅多猛多猛,结果自己降完拿去知网一查,重复…

2026/10/16 2:08:35 阅读更多 →
数论三题:排列数、亲和数与分拆素数和的算法实践

数论三题:排列数、亲和数与分拆素数和的算法实践

1. 数学趣题三合一:排列数、亲和数与分拆素数和 作为一名数学爱好者,我最近在整理几个经典的数论问题,发现"排列数亲和数分拆素数和"这三个看似不相关的概念,在实际应用中却有着微妙的联系。今天就来分享这些有趣的数学…

2026/10/15 0:44:35 阅读更多 →
一文读懂one-nio配置系统:如何优雅地管理你的应用参数

一文读懂one-nio配置系统:如何优雅地管理你的应用参数

一文读懂one-nio配置系统:如何优雅地管理你的应用参数 【免费下载链接】one-nio Unconventional I/O library for Java 项目地址: https://gitcode.com/gh_mirrors/on/one-nio one-nio是一个非常规的Java I/O库,其配置系统提供了简洁高效的参数管…

2026/10/7 2:13:24 阅读更多 →

最新新闻

一次搞定 PDF 中文方块、缺字和乱码:PDF 字体嵌入完整教程

一次搞定 PDF 中文方块、缺字和乱码:PDF 字体嵌入完整教程

一次搞定 PDF 中文方块、缺字和乱码:PDF 字体嵌入完整教程 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: https:…

2026/10/16 2:08:48 阅读更多 →
仓颉 ArkUI ListItem 组件完全指南:从基础创建到侧滑交互实战

仓颉 ArkUI ListItem 组件完全指南:从基础创建到侧滑交互实战

文档知识库教程OpenHarmony 【免费下载链接】CangjieCorpus 本仓库为仓颉编程语言语料库,聚焦 仓颉编程语言 核心知识体系,整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源,经结构化处理与专业标注,构建为支持 R…

2026/10/16 2:08:48 阅读更多 →
自动化工程师入行指南:从PLC编程到现场调试的实战经验

自动化工程师入行指南:从PLC编程到现场调试的实战经验

1. 入行前必须想清楚的几件事1.1 自动化到底在做什么很多应届生对自动化的理解停留在“PLC编程”四个字上,觉得学会梯形图就算入行了。我带过好几个实习生,第一天问他们自动化是干什么的,回答基本都是“写程序控制机器”。这个答案不算错&…

2026/10/16 2:08:48 阅读更多 →
自编码器全解析:从PCA到VAE的家族谱系与工程实践

自编码器全解析:从PCA到VAE的家族谱系与工程实践

最近重读那本经典深度学习教材,翻到第14章时我停了很久。这一章讲的是自编码器,也就是Autoencoder。表面看非常简单:输入一个x,经过编码器得到一个h,再经过解码器重建一个x’,然后让x’尽量等于x。可一旦把…

2026/10/16 2:08:48 阅读更多 →
OpenClaw用户画像实时更新:触发条件、架构设计与避坑指南

OpenClaw用户画像实时更新:触发条件、架构设计与避坑指南

最近连续被好几个做对话机器人和智能客服的朋友问到同一个问题:OpenClaw 这类开源对话框架,用户画像到底能不能实时更新?触发条件又是什么?问的人多了,我发现大家其实卡在同一个地方——文档里写着“支持用户画像”&am…

2026/10/16 2:08:48 阅读更多 →
3 条命令把抖音主页搬回本地:去水印批量下载器,免费还追更

3 条命令把抖音主页搬回本地:去水印批量下载器,免费还追更

3 条命令把抖音主页搬回本地:去水印批量下载器,免费还追更 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser…

2026/10/16 2:07:48 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →