状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
该模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。当然,如果这个判断逻辑很简单,那就没必要用“状态模式”了。【互相组合】
/**
* 抽象状态类
*
* @author administrator
*
*/
public abstract class State {
public abstract void handle(Context context);
}
class ConcreteStateA extends State {
@Override
public void handle(Context context) {
System.out.println("现在是在状态A");
context.setState(new ConcreteStateB());
}
}
class ConcreteStateB extends State {
@Override
public void handle(Context context) {
System.out.println("现在是在状态B");
context.setState(new ConcreteStateC());
}
}
class ConcreteStateC extends State {
@Override
public void handle(Context context) {
System.out.println("现在是在状态C");
context.setState(new ConcreteStateA());
}
}
/**
* Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态
*
* @author administrator
*
*/
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() {
this.state.handle(this);
}
}
/**
* 客户端:不断请求,不断更改状态
*
* @author administrator
*
*/
public class StateClient {
public static void main(String[] args) {
Context context = new Context(new ConcreteStateA());
context.request();
context.request();
context.request();
context.request();
context.request();
}
}
案例 加班
/**
* 状态模式(State)
* 抽象状态
*/
public abstract class State {
public abstract void coding(Work work);
}
/**
* 状态模式(State)
* 上午工作状态
*/
public class ForenoonState extends State {
@Override
public void coding(Work work) {
if (work.getHour() < 12) {
System.out.println("当前时间:" + work.getHour() + "点 上午工作,精神百倍!");
} else {
work.setState(new NoonState());
work.coding();
}
}
}
/**
* 状态模式(State)
* 中午工作状态
*/
public class NoonState extends State {
@Override
public void coding(Work work) {
if (work.getHour() < 13) {
System.out.println("当前时间:" + work.getHour() + "点 饿了,午饭;犯困,午休!");
} else {
work.setState(new AfternoonState());
work.coding();
}
}
}
/**
* 状态模式(State)
* 下午工作状态
*/
public class AfternoonState extends State {
@Override
public void coding(Work work) {
if (work.isFinish()) {
work.setState(new RestState());
work.coding();
} else {
if (work.getHour() < 17) {
System.out.println("当前时间:" + work.getHour() + "点 下午状态还不错,继续努力!");
} else {
work.setState(new EveningState());
work.coding();
}
}
}
}
/**
* 状态模式(State)
* 晚间工作状态
*/
public class EveningState extends State {
@Override
public void coding(Work work) {
if (work.isFinish()) {
work.setState(new RestState());
work.coding();
} else {
if (work.getHour() < 21) {
System.out.println("当前时间:" + work.getHour() + "点 加班哦,疲累之极!");
} else {
work.setState(new SleepingState());
work.coding();
}
}
}
/**
* 状态模式(State)
* 睡眠状态
*/
public class SleepingState extends State {
@Override
public void coding(Work work) {
System.out.println("当前时间:" + work.getHour() + "点 不行了,睡着了!");
}
}
/**
* 状态模式(State)
* 下班休息状态
*/
public class RestState extends State {
@Override
public void coding(Work work) {
System.out.println("当前时间:" + work.getHour() + "点 下班回家了!");
}
}
/**
* 状态模式(State)
* 工作类
*/
public class Work {
private int hour;
private State current;
private boolean finish = false;
public Work() {
current = new ForenoonState();
}
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 getState() {
return current;
}
public void setState(State current) {
this.current = current;
}
public void coding() {
current.coding(this);
}
}
/**
* 状态模式(State)
* 客户端main方法
*/
public class Client {
public static void main(String[] args) {
Work work = new Work();
work.setHour(9);
work.coding();
work.setHour(10);
work.coding();
work.setHour(12);
work.coding();
work.setHour(13);
work.coding();
work.setHour(14);
work.coding();
work.setHour(17);
work.coding();
// work.setFinish(true);
work.setHour(19);
work.coding();
work.setHour(22);
work.coding();
}
}