状态模式和策略模式的快速区别方法
一句话区分
策略模式 :我主动选择算法(主动切换)
状态模式:状态自动转换行为(被动切换)
实战快速判断方法
看"谁来决定"行为
- 策略模式 :客户端决定使用哪个算法
- 状态模式 :状态对象自己决定下一个状态
场景测试法
问自己这个问题:如果我要改变当前的行为,是我手动设置,还是行为执行过程中自动触发?
java
// 策略模式 - 我手动设置
context.setStrategy(new ConcreteStrategyA());
// 状态模式 - 状态自己决定
context.request(); // 内部可能自动切换到下一个状态
具体判断标准
1. 控制权判断
- 策略模式 :
client.setStrategy()- 控制权在外部 - 状态模式 :
state.handle()- 控制权在状态内部
2. 切换时机判断
- 策略模式:切换发生在配置阶段
- 状态模式:切换发生在运行阶段
3. 意图判断
- 策略模式 :解决多种算法选择问题
- 状态模式 :解决对象状态转换问题
做题场景快速应用
题目分析流程:
- 看问题描述 :
- 如果强调"根据条件选择不同算法" → 策略模式
- 如果强调"对象在不同状态下行为不同" → 状态模式
经典题型识别:
策略模式题目特征:
- "根据用户类型计算不同折扣"
- "根据支付方式选择不同支付策略"
- "根据文件类型使用不同解析器"
- 看状态转换 :
- 如果状态转换逻辑在客户端 → 策略模式
- 如果状态转换逻辑在状态类中 → 状态模式
直观代码区别
策略模式体验:
java
// 感觉像在"装配"对象
PaymentStrategy strategy;
if (user.isVIP()) {
strategy = new VIPPaymentStrategy();
} else {
strategy = new NormalPaymentStrategy();
}
// 我在控制用哪个策略
状态模式体验:
java
// 感觉像在"委托"行为
context.request(); // 我不关心状态怎么变
考试做题技巧
选择题快速排除:
如果看到以下关键词,优先考虑策略模式:
- "算法族"
- "可互换"
- "动态选择"
设计题答题步骤:
-
识别核心问题:是要选择算法?还是要管理状态转换?
-
画类图时:
- 策略模式:箭头从Client指向Context
- 状态模式:箭头在状态类之间循环
总结:快速决策流程
问题 → 谁决定行为变化? →
↓
我决定 → 策略模式
↓
状态自己决定 → 状态模式
实际开发中 :如果需要手动切换 行为,用策略模式;如果行为会根据内部条件自动变化,用状态模式。