定义:当一个类的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
使用场景:1.当控制一个对象状态转换条件表达式过于复杂的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。2.当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑状态模式了
实现:定义状态接口以及若干个状态实现类,接口定义一个设置状态方法。定义Context类,维护一个状态实现类示例
优点:消除庞大的条件分支语句,将各个状态转移逻辑分布到State的子类之间,来减少相互依赖
缺点:状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。
代码示例:模拟一天不同时间员工的工作状态
/**
* 状态接口
* @author liuhao
*
*/
public interface State {
void handle(Work work);
}
/**
* 上午状态
* @author liuhao
*
*/
public class ForenoonState implements State{
@Override
public void handle(Work work) {
if (work.getTime() < 12) {
System.out.println("当前时间:" + work.getTime() + " 上午,精力充沛,工作效率高!!!");
}else {
System.out.println("###进入中午状态###");
work.setState(new NoonState());
}
}
}
/**
* 中午状态
* @author liuhao
*
*/
public class NoonState implements State {
@Override
public void handle(Work work) {
if (work.getTime() < 14) {
System.out.println("当前时间:" + work.getTime() + " 中午休息!!!");
}else {
System.out.println("###进入下午状态###");
work.setState(new AfterNoonState());
}
}
}
/**
* 下午状态
* @author liuhao
*
*/
public class AfterNoonState implements State {
@Override
public void handle(Work work) {
if (work.getTime() < 18) {
System.out.println("当前时间:" + work.getTime() + " 下午犯困,工作质量下降!!!");
}else {
System.out.println("###进入下班状态###");
work.setState(new RestState());
}
}
}
/**
* 下班状态
* @author liuhao
*
*/
public class RestState implements State {
@Override
public void handle(Work work) {
System.out.println("当前时间:" + work.getTime() + " 下班休息,满血复活!!!");
}
}
/**
* 工作类
* @author liuhao
*
*/
public class Work {
private State state;
private int time;
public Work() {
this.state = new ForenoonState();;
}
public void request() {
state.handle(this);
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
public class Main {
public static void main(String[] args) {
Work work = new Work();
work.setTime(9);
work.request();
work.setTime(12);
work.request();
work.setTime(13);
work.request();
work.setTime(15);
work.request();
work.setTime(16);
work.request();
work.setTime(19);
work.request();
work.setTime(20);
work.request();
}
}
结果:

被折叠的 条评论
为什么被折叠?



