大话设计模式中说,面向对象设计其实就是希望做到代码的责任分割。其实状态模式就是一种状态的分割
状态模式
当一个对象的内在状态改变时,允许改变其行为,这个 对象看起来就像是改变了其类。
状态模式主要解决的是当控制一个对象的状态转换表达式过于复杂时的情况,把状态的判断转移到表示不同状态的一系列类当中,可以吧复杂的判断逻辑简化。
状态模式结构图
从图中可以看出,状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的欣慰分割开来。在A状态中,执行特定的行为,当不满足A状态时,具体的A状态将其转化为其他状态。这样,既可以添加新状态,也可以删除旧状态,而且体现了类的单一职责设计模式,以及设计模式的开闭原则。
具体的例子
加班状态
首先创建一个工作类来表示工作,随着时间的推移,有一个工作状态也随着改变。
public class Work {
private int hour;
private boolean finish = false;
private State current;
/**
* 通过这个方法来改变状态
* 因为判断的分支过长,分别放到不同的类当中
* 根据当前的时间来判断状态的改变
* 来改变行为
*/
public void WriteProgram(){
current.WriteProgram(this);
}
public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
}
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public State getCurrent() {
return current;
}
public void setCurrent(State current) {
this.current = current;
}
}
状态接口,所有的状态都集成这个类,来表示各种不同的状态
/**
* 状态模式,状态模式的改变状态的接口
*/
public abstract class State {
public abstract void WriteProgram(Work w);
}
几种状态
public class ForenoonState extends State {
@Override
public void WriteProgram(Work w) {
if(w.getHour()<12){
System.out.println("早上时间:工作状态良好!");
}else {
//转换状态
w.setCurrent(new NoonSate());
w.WriteProgram();
}
}
}
public class NoonSate extends State {
@Override
public void WriteProgram(Work w) {
if(w.getHour()<17){
System.out.println("昏昏欲睡!");
}else {
w.setCurrent(new SleepingState());
w.WriteProgram();
}
}
}
public class SleepingState extends State {
@Override
public void WriteProgram(Work w) {
if(w.getHour()<22){
System.out.println("无止境的加班!");
}else {
System.out.println("该回家睡觉了!");
}
}
}
客户单的调用
public class Client {
public static void main(String[] args) {
Work en = new Work();
en.setCurrent(new ForenoonState());
en.setHour(10);
en.WriteProgram();
en.setHour(15);
en.WriteProgram();
en.setHour(23);
en.WriteProgram();
}
}