0

0

设计模式之策略模式_利用多态消除繁琐的if-else

P粉602998670

P粉602998670

发布时间:2026-02-24 15:07:03

|

516人浏览过

|

来源于php中文网

原创

策略模式仅适用于同一行为的多实现、分支≥3、易扩展且逻辑复杂度相近的场景;滥用会导致代码臃肿,应避免为简单分支创建过多策略类。

设计模式之策略模式_利用多态消除繁琐的if-else

策略模式该不该用来替换所有 if-else

不是所有 if-else 都值得动用策略模式。只有当条件分支基于**同一行为的不同实现**,且分支数量 ≥ 3、未来可能新增、各分支逻辑复杂度接近时,才真正需要它。否则硬套只会让代码更难读。

常见错误现象:if (type === 'A') { ... } else if (type === 'B') { ... } 里每个分支只有一两行简单赋值或日志,却为此建了 5 个策略类——这是在给维护者添堵。

  • 使用场景:支付方式(AlipayStrategy / WechatPayStrategy / CardPayStrategy)、折扣计算(FullReductionRule / PercentOffRule / BuyOneGetOneRule
  • 参数差异:所有策略类必须实现统一接口,比如 execute(input: any): Result,不能一个要 context,另一个要 config
  • 性能影响:策略对象通常需提前实例化或懒加载,频繁创建会增加 GC 压力;若分支极少且执行极快,直接 if-else 反而更轻量

如何避免策略注册表变成新 if-else

很多人把策略存进 Map 或对象,再用 strategyMap.get(type) 获取,但初始化这个 map 时又写了一堆 if (type === 'X') map.set('X', new XStrategy()) ——等于把 if-else 搬了个家。

正确做法是让策略“自注册”或靠配置驱动:

  • 使用装饰器(TypeScript)或注解(Java),让每个策略类声明自己支持的 type,启动时自动扫描注册
  • 用 JSON 配置文件定义 type → class 名映射,运行时动态 require() 或反射加载(注意 Node.js 的 require.cache 和 Webpack 的 tree-shaking 影响)
  • 最简方案:用 Object literal 直接写死映射,但确保 key 和 value 类型一致,例如 { 'vip': VipDiscount, 'student': StudentDiscount },别混入字符串或函数

策略类里还能不能再有 if-else

能,但仅限于**当前策略内部的细粒度判断**,比如 StudentDiscount.execute() 里按年级分折扣率:if (grade === 'freshman') { ... }。这不破坏策略模式契约,因为对外仍是单一行为入口。

奇布塔
奇布塔

基于AI生成技术的一站式有声绘本创作平台

下载

容易踩的坑:

  • 在策略基类或上下文类(Context)里写跨策略的 if-else,比如根据用户地区决定用哪个策略——这说明策略划分维度错了,应该把地区纳入策略选择逻辑,而不是藏在某个策略内部
  • 策略类之间互相调用或继承,导致依赖混乱;策略应彼此隔离,只共享输入输出结构
  • 把状态(如用户登录态、库存余量)塞进策略构造函数,却不校验是否为空或过期,运行时报 Cannot read property 'xxx' of undefined

TypeScript 下类型安全怎么兜住

光靠 interface 约束 execute() 方法签名不够。如果策略返回类型不同(比如有的返回 Promise<void></void>,有的返回 string),调用方就无法安全处理。

实操建议:

  • 定义泛型策略接口:interface Strategy<tinput toutput> { execute(input: TInput): TOutput }</tinput>,强制每个策略明确自己的输入输出
  • 注册表类型写成 Record<string strategy commonoutput>></string>,逼迫所有策略收敛到公共类型,必要时用联合类型或 discriminated union 包装差异字段
  • 别忽略 unknownany 的转换风险:从配置读取的 type 字符串必须经过 Object.keys(strategyMap).includes(rawType) 校验,否则 strategyMap[rawType as keyof typeof strategyMap] 会绕过类型检查

最常被忽略的一点:策略的生命周期和上下文耦合。比如一个策略依赖 HttpClient 实例,但没做依赖注入或传参隔离,多个请求并发时共享连接池或 token,结果 A 用户看到 B 用户的数据——这不是模式问题,是设计落地时忘了“策略是无状态的”这个前提。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

40

2026.02.13

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

448

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

323

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

829

2023.08.22

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号