1.状态模式的概念:
当一个对象的状态发生改变时就改变其行为,这个对象看起来像是改变了其类;
理解:就 if(条件){执行代码} else if(条件){执行代码 }... 多条件判断语句来说 状态发生改变 就是不同的执行条件,改变其行为就是根据不同的执行条件来执行不同的代码。
2.状态模式的结构图
3. 状态模式的练习示例:
定义一个工作的类,维护了一个State的引用:
/**
* 定义一个工作类
* 维护一个state的引用
*/
@Data
public class Work {
//维护一个state的引用
private State state;
//当前时间 其实也就是执行条件
private Integer hour;
//是否完成工作 也是一个执行条件
private boolean FlagFinishedJob;
/**
* 初始化工作状态为上午
*/
public Work(){
state = new CurrenoonStates();
}
public void doJob(){
state.handle(this);
}
}
定义一个State状态的接口:
/**
* 状态接口
*/
interface State {
public void handle(Work work);
}
上午的状态:
/**
* 上午的工作状态
*/
public class CurrenoonStates implements State{
/**
* 该方法相当于进入了一个条件语句表达式
* @param work
*/
@Override
public void handle(Work work) {
if (work.getHour() < 12) {
System.out.println("当前时间" + work.getHour() + "精神充沛,加油工作!");
}else {
//相当于指明下一个要执行的if else 条件判断语句是哪儿个 指明一个方向
work.setState(new NoonStates());
//出发前往下一个判断语句
work.doJob();
}
}
}
中午的工作状态:
/**
* 中午的工作状态
*/
public class NoonStates implements State {
@Override
public void handle(Work work) {
if (work.getHour() <13 ) {
System.out.println("当前时间" + work.getHour() + ",饿了,吃午饭午休");
}else {
//指明下一个要执行的if else条件判断语句是谁
work.setState(new AfterNoonStates());
//出发前往下一个条件语句
work.doJob();
}
}
}
下午的工作状态:
/**
* 下午的工作状态
*/
public class AfterNoonStates implements State {
@Override
public void handle(Work work) {
if (work.getHour() < 17 ) {
System.out.println("当前时间" + work.getHour() + "下午状态还不错继续努力!");
}else {
//指明下一个要执行的if else 条件判断语句
work.setState(new EveningStates());
//出发前往下一个条件判断语句
work.doJob();
}
}
}
晚上的工作状态:
/**
* 晚上的工作状态
*/
public class EveningStates implements State {
@Override
public void handle(Work work) {
//用到了另外一个条件 指明如果不符合要执行的的下一个state(条件判断语句)
if (work.isFlagFinishedJob()) {
work.setState(new RestStates());
}else {
if (work.getHour() < 21 ) {
System.out.println("当前时间" + work.getHour() + ",加班,十分疲惫!");
}else {
//当前两个条件都不符合的话,指明下一个state(if else 条件判断语句)
work.setState(new SleepingStates());
//前往下一个条件判断语句
work.doJob();
}
}
}
}
休息的工作状态:
/**
* 休息的工作状态
*/
public class RestStates implements State {
@Override
public void handle(Work work) {
System.out.println("当前时间" + work.getHour() + ",工作做完了,下班回家!");
}
}
睡着了的状态:
/**
* 睡着的状态
*/
public class SleepingStates implements State {
@Override
public void handle(Work work) {
System.out.println("当前时间" + work.getHour() + ",不行了太困了,睡着了!");
}
}
测试:
public class Test {
public static void main(String[] args) {
Work work = new Work();
work.setHour(8);
work.doJob();
work.setHour(16);
work.doJob();
work.setFlagFinishedJob(false);
work.setHour(22);
work.doJob();
}
}
控制台:
4.状态模式的练习结构图
5.总结
状态模式解决的问题:状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况,把状态的判断逻辑和状态相关的行为转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化.
好处:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个State子类对象中,所以通过定义新的子类可以很容易地增加新的状态和转换。
什么时候使用:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了
缺点:
1、状态模式的使用必然会增加系统类和对象的个数。
2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
3、状态模式对象之间耦合度高,破坏"开闭原则"