java 之 状态模式(大话设计模式)
看过大话设计模式的小伙伴,都知道大话设计模式中的demo代码不是JAVA的,对于编程来说,设计模式不限于任何语言,讲述的是编程的思想。
今天笔者再次看这篇文章时,看了下别人的博客对于设计模式的理解,希望能汲取点其中的核心思想,意外的是看到很多博客对状态模式理解的可能有些偏差。
正常来说,如果没有状态模式的情况下,我们会用一堆if else if或者 switch case来处理。寻找到正确的入口!这样的代码违背了单一原则,日后维护会牵一发而动全身。
使用状态模式能够很好的解决这个问题,来看下类图
大话设计模式-类图
再看下简单的笔者的例子:
/** * 抽象状态接口 */ public interface State { public void WriteProgram(Work work); }
/** * 上下文 */ public class Work { private State state; private Integer hour; public Work() { state = new GoodMorning(); } public void writeProgram() { state.WriteProgram(this); } public Integer getHour() { return hour; } public void setHour(Integer hour) { this.hour = hour; } public void setState(State state) { this.state = state; } }
/** * 早晨状态 状态的一个分支 */ public class GoodMorning implements State{ @Override public void WriteProgram(Work work) { if (work.getHour() < 12) { System.out.println("工作状态很好啊"); } else { work.setState(new AfterMorning()); work.writeProgram(); } } }
/** * 状态的分支 下午状态 */ public class AfterMorning implements State { @Override public void WriteProgram(Work work) { if (work.getHour() < 14) { System.out.println("有点困了"); } else { work.setState(new Evening()); work.writeProgram(); } } }
/** * 夜晚状态 状态的一个分支 */ public class Evening implements State { @Override public void WriteProgram(Work work) { if (work.getHour() >= 19) { System.out.println("该下班了哦"); } } }
以上是笔者对状态模式的理解,如果需求有变更,增加某些状态,我们只需要在增加子类,如果是在中间插入状态,我们只需要改上一个状态的指向就可以了。
希望能帮助学习状态模式的小伙伴,不要生搬硬套设计模式,理解其精髓最重要!!!