状态模式
定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
通俗的讲,状态模式主要解决当控制一个对象状态转换的条件表达式(判断过多)过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
抽象状态类:
public abstract class State { public abstract void Handle(Context context); }
具体状态类A:
public class ConcreteStateA extends State { @Override public void Handle(Context context) { context.state = new ConcreteStateB(); } }
具体状态类B:
public class ConcreteStateB extends State { @Override public void Handle(Context context) { context.state = new ConcreteStateA(); } }
Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态
public class Context { public State state; public Context(State state){ this.state = state; } public void request(){ state.Handle(this); } }
Main:
public class Main { public static void main(String[] args) { Context context1 = new Context(new ConcreteStateA()); context1.request(); } }
通过状态模式可以将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。将特定状态相关的行为放在一个对象中,可以消除庞大的条件分支语句。
以工作加班为例来表示状态模式的运用
public abstract class State { public abstract void writeProgram(Work w); }
//上午工作状态 public class ForenoonState extends State { @Override public void writeProgram(Work w) { if(w.hour < 12){ System.out.println("当前时间:"+w.hour); }else { w.setState(new NoonState()); w.writeProgram(); } } }
//中午工作状态 public class NoonState extends State { @Override public void writeProgram(Work w) { if(w.hour < 13){ System.out.println("当前时间:"+w.hour); }else { w.setState(new AfternoonState()); w.writeProgram(); } } }
public class AfternoonState extends State { @Override public void writeProgram(Work w) { if(w.hour < 17){ System.out.println("当前时间:"+w.hour); }else { w.setState(new EveningState()); w.writeProgram(); } } }
public class EveningState extends State { @Override public void writeProgram(Work w) { if(w.taskFinished){ w.setState(new RestState()); w.writeProgram(); }else { if (w.hour<21){ System.out.println("当前时间:"+w.hour); }else { w.setState(new SleepingState()); w.writeProgram(); } } } }
public class SleepingState extends State { @Override public void writeProgram(Work w) { System.out.println("当前时间"+w.hour); } }
public class RestState extends State { @Override public void writeProgram(Work w) { System.out.println("当前时间:"+w.hour); } }
public class Work { private State current; public Work(){ current = new ForenoonState(); } public double hour; public boolean finish = false; public boolean taskFinished; public void setState(State s){ current = s; } public void writeProgram(){ current.writeProgram(this); } }
public class Main { public static void main(String[] args) { Work work = new Work(); work.hour = 9; work.writeProgram(); work.hour = 10; work.writeProgram(); work.hour = 12; work.writeProgram(); work.hour = 13; work.writeProgram(); work.hour = 14; work.writeProgram(); work.hour = 17; work.writeProgram(); work.taskFinished = false; work.hour = 19; work.writeProgram(); work.hour = 22; work.writeProgram(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix