12-状态模式
12-状态模式
概念
状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的逻辑简化。当然,如果这个状态判断很简单,就没必要用状态模式了。
好处及用处
好处:将特定状态相关的行为局部化,并且将不同状态的行为分割开来;将特定的状态相关的行为都放入一个对象中,由于所欲与状态相关的代码都存在与某个具体状态中,所有通过定义新的子类可以很容易地增加新的状态和转换
状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖
什么时候使用:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式
实践
用一个每天上班时状态随时间的变化的例子来阐释状态模式
package com.gof.state;
/**
* 功能描述
*
* @since 2023-02-01
*/
public abstract class State {
public abstract void writeProgram(Work w);
}
package com.gof.state;
/**
* 功能描述
*
* @since 2023-02-01
*/
public class Work {
private State current;
private double hour;
public State getCurrent() {
return current;
}
public void setCurrent(State current) {
this.current = current;
}
public double getHour() {
return hour;
}
public void setHour(double hour) {
this.hour = hour;
}
public Work() {
current = new ForenoonState();
}
public void writeProgram() {
current.writeProgram(this);
}
}
package com.gof.state;
/**
* 功能描述
*
* @since 2023-02-01
*/
public class ForenoonState extends State {
@Override
public void writeProgram(Work w) {
if (w.getHour() < 12) {
System.out.printf("当前时间:%f 点 上午工作,精神百倍%n", w.getHour());
} else {
w.setCurrent(new NoonState());
w.writeProgram();
}
}
}
package com.gof.state;
/**
* 功能描述
*
* @since 2023-02-01
*/
public class NoonState extends State {
@Override
public void writeProgram(Work w) {
if (w.getHour() < 13) {
System.out.printf("当前时间:%f 点 饿了,午饭:犯困,午休。%n", w.getHour());
} else {
w.setCurrent(new AfternoonState());
w.writeProgram();
}
}
}
package com.gof.state;
/**
* 功能描述
*
* @since 2023-02-01
*/
public class AfternoonState extends State {
@Override
public void writeProgram(Work w) {
if (w.getHour() < 17) {
System.out.printf("当前时间:%f 点 下午状态还不错,继续努力。%n", w.getHour());
} else {
w.setCurrent(new EveningState());
w.writeProgram();
}
}
}
package com.gof.state;
/**
* 功能描述
*
* @since 2023-02-01
*/
public class EveningState extends State {
@Override
public void writeProgram(Work w) {
if (w.getHour() < 21) {
System.out.printf("当前时间:%f 点 加班哦,疲惫至极。%n", w.getHour());
} else {
w.setCurrent(new SleepingState());
w.writeProgram();
}
}
}
package com.gof.state;
/**
* 功能描述
*
* @since 2023-02-01
*/
public class SleepingState extends State {
@Override
public void writeProgram(Work w) {
System.out.printf("当前时间:%f 点 不行了,睡着了。%n", w.getHour());
}
}
package com.gof.state;
/**
* 功能描述
*
* @since 2023-02-01
*/
public class Client {
public static void main(String[] args) {
Work work = new Work();
work.setHour(9);
work.writeProgram();
work.setHour(10);
work.writeProgram();
work.setHour(12);
work.writeProgram();
work.setHour(13);
work.writeProgram();
work.setHour(14);
work.writeProgram();
work.setHour(17);
work.writeProgram();
work.setHour(19);
work.writeProgram();
work.setHour(22);
work.writeProgram();
}
}