简单梳理状态模式
状态模式实现
现实工作中我们经常面临工作任务重需要加班的情况,
但是通常一天的工作效率与时间点有一定关系,比如饭后困效率低等。
我们就用不同的时间点,工作效率问题这个场景来简单梳理状态模式。
首先我们定义基本类,工作状态类。
public abstract class State {
public abstract void WriteProgram(Work work);
}
定义工作类(包括工作状态,工作时间点,是否完成工作)
public class Work {
private State current;
private double hour;
private boolean finish;
public Work(){
current = new ForenoonState();
}
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 boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public void WriteProgram(){
current.WriteProgram(this);
}
}
针对不同的时间点,来定义几个不同的工作效率的具体类。
上午
public class ForenoonState extends State{
@Override
public void WriteProgram(Work work) {
if(work.getHour()<12){
System.out.println("当前时间"+work.getHour() +"点,上午工作,精神百倍。" );
}else{
work.setCurrent(new NoonState());
work.WriteProgram();
}
}
}
中午
public class NoonState extends State{
@Override
public void WriteProgram(Work work) {
if(work.getHour()<13){
System.out.println("当前时间"+work.getHour() +"点,饭后犯困,需要午休。");
}else{
work.setCurrent(new AfternoonState());
work.WriteProgram();
}
}
}
下午
public class AfternoonState extends State{
@Override
public void WriteProgram(Work work) {
if(work.getHour()<17){
System.out.println("当前时间"+work.getHour() +"点,下午状态还不错,继续。");
}else{
work.setCurrent(new EveningState());
work.WriteProgram();
}
}
}
晚上
public class EveningState extends State{
@Override
public void WriteProgram(Work work) {
if(work.isFinish()){
work.setCurrent(new RestState());
work.WriteProgram();
}else{
if(work.getHour()<21){
System.out.println("当前时间"+work.getHour() +"点,加班哦,疲惫至极。");
}else{
work.setCurrent(new SleepingState());
work.WriteProgram();
}
}
}
}
下班
public class RestState extends State{
@Override
public void WriteProgram(Work work) {
System.out.println("当前时间"+work.getHour() +"点,下班回家。");
}
}
睡觉
public class SleepingState extends State{
@Override
public void WriteProgram(Work work) {
System.out.println("当前时间"+work.getHour() +"点,不行了,要睡了。");
}
}
这样我们前期的定义就算做完了,
然后我们看具体应用中的使用。
定义业务方法
看在具体业务逻辑中如何使用
public class StateTest {
public static void main(String[] args) {
//状态模式
func1();
}
public static void func1(){
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.setFinish(false);
work.WriteProgram();
work.setHour(19);
work.WriteProgram();
work.setHour(22);
work.WriteProgram();
}
}
执行结果
当前时间{9.0}点,上午工作,精神百倍。
当前时间{10.0}点,上午工作,精神百倍。
当前时间{12.0}点,饭后犯困,需要午休。
当前时间{13.0}点,下午状态还不错,继续。
当前时间{14.0}点,下午状态还不错,继续。
当前时间{17.0}点,加班哦,疲惫至极。
当前时间{17.0}点,加班哦,疲惫至极。
当前时间{19.0}点,加班哦,疲惫至极。
当前时间{22.0}点,不行了,要睡了。
结果分析
状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是,当控制一个对象状态转换的条件表达式过于复杂时,
把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
联系作者
微信公众号
xiaomingxiaola
(BossLiu)
QQ群
58726094
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com