状态模式与策略模式的快速区分与应用

状态模式和策略模式的快速区别方法

一句话区分

策略模式 :我主动选择算法(主动切换)
状态模式:状态自动转换行为(被动切换)


实战快速判断方法

看"谁来决定"行为

  • 策略模式客户端决定使用哪个算法
  • 状态模式状态对象自己决定下一个状态

场景测试法

问自己这个问题:如果我要改变当前的行为,是我手动设置,还是行为执行过程中自动触发?

java 复制代码
// 策略模式 - 我手动设置
context.setStrategy(new ConcreteStrategyA());

// 状态模式 - 状态自己决定
context.request(); // 内部可能自动切换到下一个状态

具体判断标准

1. 控制权判断

  • 策略模式client.setStrategy() - 控制权在外部
  • 状态模式state.handle() - 控制权在状态内部

2. 切换时机判断

  • 策略模式:切换发生在配置阶段
  • 状态模式:切换发生在运行阶段

3. 意图判断

  • 策略模式 :解决多种算法选择问题
  • 状态模式 :解决对象状态转换问题

做题场景快速应用

题目分析流程

  1. 看问题描述
    • 如果强调"根据条件选择不同算法" → 策略模式
  • 如果强调"对象在不同状态下行为不同" → 状态模式

经典题型识别

策略模式题目特征

  • "根据用户类型计算不同折扣"
  • "根据支付方式选择不同支付策略"
  • "根据文件类型使用不同解析器"
  1. 看状态转换
    • 如果状态转换逻辑在客户端策略模式
  • 如果状态转换逻辑在状态类中状态模式

直观代码区别

策略模式体验

java 复制代码
// 感觉像在"装配"对象
PaymentStrategy strategy;
if (user.isVIP()) {
    strategy = new VIPPaymentStrategy();
} else {
    strategy = new NormalPaymentStrategy();
}
// 我在控制用哪个策略

状态模式体验

java 复制代码
// 感觉像在"委托"行为
context.request(); // 我不关心状态怎么变

考试做题技巧

选择题快速排除

如果看到以下关键词,优先考虑策略模式

  • "算法族"
  • "可互换"
  • "动态选择"

设计题答题步骤

  1. 识别核心问题:是要选择算法?还是要管理状态转换?

  2. 画类图时

    • 策略模式:箭头从Client指向Context
    • 状态模式:箭头在状态类之间循环

总结:快速决策流程

复制代码
问题 → 谁决定行为变化? → 
    ↓
    我决定 → 策略模式
    ↓
    状态自己决定 → 状态模式

实际开发中 :如果需要手动切换 行为,用策略模式;如果行为会根据内部条件自动变化,用状态模式。

相关推荐
前端不太难11 分钟前
鸿蒙游戏的“帧”到底是什么?
游戏·状态模式·harmonyos
阿Y加油吧12 分钟前
二刷 LeetCode:5. 最长回文子串 & 1143. 最长公共子序列 复盘笔记
笔记·算法·leetcode
ximu_polaris22 分钟前
设计模式(C++)-行为型模式-责任链模式
c++·设计模式·责任链模式
geovindu3 小时前
go: Visitor Pattern
开发语言·设计模式·golang·访问者模式
三品吉他手会点灯9 小时前
C语言学习笔记 - 20.C编程预备计算机专业知识 - 变量为什么必须的初始化【重点】
c语言·笔记·学习
kobesdu9 小时前
【ROS2实战笔记-12】rosshow:终端里的盲文可视化与无头机器人的现场调试
笔记·机器人·ros·移动机器人
sakiko_9 小时前
UIKit学习笔记1-创建项目(使用UIKit)、使用组件
笔记·学习
智者知已应修善业10 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
智者知已应修善业12 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
JasmineX-112 小时前
数据结构(笔记)——双向链表
c语言·数据结构·笔记·链表