状态模式定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式初步理解:状态模式内部含有和一个状态对象的引用,当状态不一样时,这个引用所指向的对象也不一样。调用的方法自然也就不一样。和策略模式有些类似。
code…
状态的抽象接口:
public interface State {
public void work(Context context);
}
具体的三个状态:
public class ExciteState implements State {
@Override public void work(Context context) {
System.out.println("在兴奋状态中干活");
context.setState(new ExhaustState());
}
@Override public String toString() {
return "兴奋状态";
}
}
public class ExhaustState implements State {
@Override public void work(Context context) {
System.out.println("在疲劳状态中干活");
context.setState(new SleepyState());
}
@Override public String toString() {
return "疲劳状态";
}
}
public class SleepyState implements State {
@Override public void work(Context context) {
System.out.println("正在睡梦中干活");
context.setState(new ExciteState());//设置下一状态
}
@Override public String toString() {
return "睡眠状态";
}
}
context上下文类:
public class Context {
private State state;
public Context(State state) {
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void request()
{
state.work(this);
}
}
内部的引用State所指向的对象不同时,调用的work方法不同。再执行完当前状态要执行的事务后,设置下一状态。
mian方法:
public class Main {
public static void main(String[] args) {
int i=100;
Context context=new Context(new ExciteState());
while(--i!=0) {
System.out.println(context.getState());
context.request();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果是在三种状态中循环切换。
兴奋状态
在兴奋状态中干活
疲劳状态
在疲劳状态中干活
睡眠状态
正在睡梦中干活
......
总结:状态模式是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。将特定的状态相关的行为都放入一个对象中,可以通过定义新的子类来增加新的状态。
上一篇 |
---The End---
| 下一篇 |