状态模式,主要解决用于控制对象的一个条件过于复杂时,把状态的判断逻辑移到一系列表示状态的类中。就是把对象的多种状态,每一个状态都写成一个类,然后判断最终实现哪一个类,让各自的状态在各自的类中完成。
我们拿一天的工作举例子,上午去上班,开始工作,中午午睡,下午继续工作,工作完成的话就回家,没完成就继续加班,最后困死在工作桌上。
在学状态模式之前,我们肯定是习惯的用多个if去判断状态。
public class function {
public static void main(String []args){
Work1 work=new Work1();
work.finished=false;
work.Hour=22;
work.workState(work.Hour);
}
}
class Work1{
int Hour;
boolean finished;
public void workState(int Hour){
this.Hour=Hour;
if (Hour<12){
System.out.println("上午开始工作"+Hour);
} else if (Hour<13) {
System.out.println("午睡"+Hour);
} else if (Hour<17) {
System.out.println("下午继续工作"+Hour);
}
else {
if (finished==true){
System.out.println("下班回家"+Hour);
}
else {
if (Hour>21)
System.out.println("困死了"+Hour);
else System.out.println("加班"+Hour);
}
}
}
}
在写代码时,一个方法过于长其实是不好的,而且如果我们想要增加一个新的状态,会很麻烦,不仅要更改原有的类,而且我们还需要谨慎考虑改状态应该写在哪个if中。这违反了单一职责原则和开放-封闭原则。
状态模式的应用:
public class StateModel {
public static void main(String[] args) {
work w1 = new work();
w1.setHour(22);
w1.setFinished(false);
w1.goingState();
}
}
interface state {
public void setState(work w);
}
class morning implements state {
public void setState(work w) {
if (w.Hour < 12) {
System.out.println("上午开始上班 " + w.Hour);
} else {
w.transformState(new noon());
w.goingState();
}
}
}
class noon implements state {
public void setState(work w) {
if (w.Hour < 13) {
System.out.println("午睡 " + w.Hour);
} else {
w.transformState(new afternoon());
w.goingState();
}
}
}
class afternoon implements state {
public void setState(work w) {
if (w.Hour < 17) {
System.out.println("下午继续工作 " + w.Hour);
} else {
w.transformState(new evening());
w.goingState();
}
}
}
class evening implements state {
public void setState(work w) {
if (w.finished == true) {
w.transformState(new backing());
w.goingState();
} else {
w.transformState(new keepWorking());
w.goingState();
}
}
}
class backing implements state {
public void setState(work w) {
System.out.println("下班回家 " + w.Hour);
}
}
class keepWorking implements state {
public void setState(work w) {
if (w.Hour < 21)
System.out.println("继续加班 " + w.Hour);
else {
w.transformState(new tired());
w.goingState();
}
}
}
class tired implements state {
public void setState(work w) {
System.out.println("困死在工作桌上 " + w.Hour);
}
}
class work {
int Hour;
state currentState;
boolean finished;
public int getHour() {
return Hour;
}
public void setHour(int hour){
this.Hour=hour;
}
public boolean getFinished() {
return finished;
}
public void setFinished(boolean finished) {
this.finished = finished;
}
work() {
currentState = new morning();
}
public void transformState(state st) {
currentState = st;
}
public void goingState() {
currentState.setState(this);
}
状态模式将原写在一个方法中的多个状态,拿出来分别写成一个类,在类中实现状态,如果不符合就会进入下一个状态类中进行判断,每一个类只负责管理一个状态,而且如果增加新的状态,我们只需新增一个状态类,并指明由哪个状态跳转到该状态就可以了。这样就消除了我们需要耗费更多精力写的冗杂的if判断语句了。