状态模式
2023-06-13 09:12:14 时间
最近在看状态机,先逐步从状态模式学起
1. 状态模式(State Pattern)
允许对象在内部状态改变时改变它的行为, 对象看起来好象改了它的类。在传统中编程中使用 if-else 对所有情况判断并作出对应的行为,这不仅违背了开闭原则,而且会显得臃肿难于阅读和维护,状态模式是用来解决这个问题的
状态模式的组成:
- State:状态接口
- ConcreteState:状态实现类
- Context:环境
2. 流程
灯有打开和关闭两种状态,我们用灯的开关状态来说明状态模式:(下面没有使用状态模式)
public class Light {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
// 这里状态只有两种,若情况较多则会臃肿难以维护
public void handle() {
if ("TurnOn".equals(state)) {
System.out.println("灯亮了");
} else if ("TurnOff".equals(state)) {
System.out.println("灯灭了");
}
}
}
2.1 State
public interface State {
void handle(Context context);
}
2.2 TurnOnState
public class TurnOnState implements State {
@Override
public void handle(Context context) {
System.out.println("当前状态 TurnOn: 灯亮了");
context.setState(this);
}
}
2.3 TurnOffState
public class TurnOffState implements State {
@Override
public void handle(Context context) {
System.out.println("当前状态 TurnOff: 灯灭了");
context.setState(this);
}
}
2.4 Context
public class Context {
private State state;
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
2.5 测试
使用了状态模式会让代码结构复杂起来,但条件逻辑会更加清晰
public class Test {
public static void main(String[] args) {
Context context = new Context();
TurnOnState turnOnState = new TurnOnState();
turnOnState.handle(context);
TurnOffState turnOffState = new TurnOffState();
turnOffState.handle(context);
}
}
// 当前状态 TurnOn: 灯亮了
// 当前状态 TurnOff: 灯灭了
状态模式和策略模式较为相似,区别在于状态模式是依靠状态来改变行为,且有状态转变
相关文章
- 23种设计模式之状态模式和策略模式的区别
- Git忽略本地的文件修改,保留其在远程仓库的状态.md
- 漫谈模式之状态模式
- 【设计模式】状态模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
- 设计模式之状态模式(行为型)详解架构师
- Linux检测网卡状态:必要步骤(linux检测网卡状态)
- MySQL Status Ndb_config_from_port 数据库状态作用意思及如何正确
- MySQL Status Performance_schema_stage_classes_lost 数据库状态作用意思及如何正确
- 监测洞悉Linux服务器状态监测无忧(linux服务器状态)
- SAP Job 状态记录详解编程语言
- MySQL事件了解状态及其作用(mysql中事件的状态)
- Linux 下查看 VNC 连接状态(linux 查看 vnc)