状态模式

定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

通俗的讲,状态模式主要解决当控制一个对象状态转换的条件表达式(判断过多)过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

抽象状态类:

public abstract class State {
    public abstract void Handle(Context context);
}

具体状态类A:

public class ConcreteStateA extends State {
    @Override
    public void Handle(Context context) {
        context.state = new ConcreteStateB();
    }
}

具体状态类B:

public class ConcreteStateB extends State {
    @Override
    public void Handle(Context context) {
        context.state = new ConcreteStateA();
    }
}

Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态

复制代码
public class Context {
    public State state;

    public Context(State state){
        this.state = state;
    }

    public void request(){
        state.Handle(this);
    }
}
复制代码

Main:

public class Main {
    public static void main(String[] args) {
        Context context1 = new Context(new ConcreteStateA());
        context1.request();
    }

}

通过状态模式可以将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。将特定状态相关的行为放在一个对象中,可以消除庞大的条件分支语句。

 

以工作加班为例来表示状态模式的运用

 

public abstract class State {
    public abstract void writeProgram(Work w);
}
复制代码
//上午工作状态
public class ForenoonState extends State {
    @Override
    public void writeProgram(Work w) {
        if(w.hour < 12){
            System.out.println("当前时间:"+w.hour);
        }else {
            w.setState(new NoonState());
            w.writeProgram();
        }
    }
}
复制代码
复制代码
//中午工作状态
public class NoonState extends State {
    @Override
    public void writeProgram(Work w) {
        if(w.hour < 13){
            System.out.println("当前时间:"+w.hour);
        }else {
            w.setState(new AfternoonState());
            w.writeProgram();
        }
    }
}
复制代码
复制代码
public class AfternoonState extends State {
    @Override
    public void writeProgram(Work w) {
        if(w.hour < 17){
            System.out.println("当前时间:"+w.hour);
        }else {
            w.setState(new EveningState());
            w.writeProgram();
        }
    }
}
复制代码
复制代码
public class EveningState extends State {
    @Override
    public void writeProgram(Work w) {
        if(w.taskFinished){
            w.setState(new RestState());
            w.writeProgram();
        }else {
            if (w.hour<21){
                System.out.println("当前时间:"+w.hour);
            }else {
                w.setState(new SleepingState());
                w.writeProgram();
            }
        }
    }
}
复制代码
public class SleepingState extends State {
    @Override
    public void writeProgram(Work w) {
        System.out.println("当前时间"+w.hour);
    }
}
public class RestState extends State {
    @Override
    public void writeProgram(Work w) {
        System.out.println("当前时间:"+w.hour);
    }
}
复制代码
public class Work {
    private State current;
    public Work(){
        current = new ForenoonState();
    }
    public double hour;

    public boolean finish = false;

    public boolean taskFinished;

    public void setState(State s){
        current = s;
    }

    public void writeProgram(){
        current.writeProgram(this);
    }

}
复制代码
复制代码
public class Main {
    public static void main(String[] args) {
        Work work = new Work();
        work.hour = 9;
        work.writeProgram();
        work.hour = 10;
        work.writeProgram();
        work.hour = 12;
        work.writeProgram();
        work.hour = 13;
        work.writeProgram();
        work.hour = 14;
        work.writeProgram();
        work.hour = 17;
        work.writeProgram();

        work.taskFinished = false;

        work.hour = 19;
        work.writeProgram();
        work.hour = 22;
        work.writeProgram();
    }
}
复制代码

 

posted @   WXY_WXY  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示