状态机、状态模式

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、状态模式

一个对象的内在状态改变时允许改变其行为这个对象看起来像是改变了其类
image.png

状态类

public enum State {
    RAIN,
    SUNNY,
    THURSDAY
}

worker.java

package com.vv.status;

public class Worker {

    private String name;

    private State state;


    public static void main(String[] args) {
        Worker worker = new Worker();
        worker.setName("兵子");
        worker.setState(State.SUNNY);
        worker.oneDay();
    }
    
    public void oneDay(){
        System.out.println("7:00 上班");
        if (state == State.RAIN){
            System.out.println("今天下雨坐公交车上班");
        }else if (state == State.SUNNY){
            System.out.println("晴天骑车上班");
        }else if (state == State.THURSDAY){
            System.out.println("今天星期四吃肯德基");
        }
        System.out.println("23:00 下班");
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
}

通过if else实现

public interface IState {
    void handle();
}
public class RainState implements IState {
    @Override
    public void handle() {
        System.out.println("今天下雨坐公交车上班");
    }
}
public class Worker {

    private String name;

    private IState iState;


    public static void main(String[] args) {
        Worker worker = new Worker();
        worker.setName("兵子");
        worker.setiState(new RainState());
        worker.oneDay4MachineModel();
    }


    public void oneDay4MachineModel(){
        System.out.println("7:00 上班");
        iState.handle();
        System.out.println("23:00 下班");
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public IState getiState() {
        return iState;
    }

    public void setiState(IState iState) {
        this.iState = iState;
    }
}

实际就是多态思想取代之前的if else
状态模式和策略者模式实际上是比较相近的策略模式功能更强大

二、状态和策略者

策略模式其思想是针对一组算法将每一种算法都封装到具有共同接口的独立的类中从而是他们可以相互替换。策略模式最大的特点是使得算法可以在不影响客户端的情况下发生变化从而改变不同的功能

状态模式允许一个对象在其内部状态改变时改变他的行为对象看起来似乎修改了它的类

三、状态机

image.png
由现态转化为次态的过程中需要经历某个事件并执行对应的动作比如说现态是下单经历了支付这个事件动作为处理支付逻辑转账汇款最终转化为次态为已下单

四、请假流程

image.png

public enum State {

    FINSH,
    UN_SUBMIT,
    LEADER_CHECK,
    HR_CHECK;

}
public class Test {


    static State getNext(State state){
        if (state == State.UN_SUBMIT){
            return State.LEADER_CHECK;
        }else if (state == State.LEADER_CHECK){
            return State.HR_CHECK;
        }else if (state == State.HR_CHECK){
            return State.FINSH;
        }
        throw new IllegalArgumentException("非法状态");
    }

    public static void main(String[] args) {
        State state = State.UN_SUBMIT;
        System.out.println(getNext(state));
    }
}

if else方式实现状态切换

public enum State {

    FINSH{
        @Override
        State getNext() {
            return this;
        }
    },
    UN_SUBMIT{
        @Override
        State getNext() {
            return LEADER_CHECK;
        }
    },
    LEADER_CHECK{
        @Override
        State getNext() {
            return HR_CHECK;
        }
    },
    HR_CHECK{
        @Override
        State getNext() {
            return FINSH;
        }
    };

    abstract State getNext();
}
public class Test {
    public static void main(String[] args) {
        State state = State.UN_SUBMIT;
        System.out.println(state.getNext());
    }
}

在枚举中定义一个抽象方法通过枚举实现一个有限状态机替代if else 写法
缺陷在领导审批过程中领导可能同意也可能拒绝可能并不会直接到Hr审批所以不仅需要当前状态还需要一个事件

引入状态和事件两个元素确定下一个状态可以用两个map嵌套的方式实现

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6