java设计模式之状态机模式_非淡泊无以明志,非宁静无以致远-CSDN博客

①UML设计:

②定义:不同的状态,不同的行为,每个状态有着相应的行为

③示例:

状态机实现电梯运转

*UML设计:

*代码实现:

/** * 定义电梯的状态:打开、关闭、运行、停止 */interface LiftState {    void open();     void close();     void run();     void stop();}
public class OpenState implements LiftState {    //拥有一个电梯对象,用于更新电梯当前状态    Lift lift;     public OpenState(Lift lift) {        //通过构造函数引入电梯的实例化对象        this.lift = lift;    }     @Override    public void open() {        //电梯当前状态--> 打开        System.out.println("lift is openning");    }     @Override    public void close() {        System.out.println("lift is closeing");        //更改电梯当前状态-->关闭        lift.setState(lift.getCloseingState());    }     @Override    public void run() {        //电梯处于打开状态,不能直接运行,需要先关闭        System.out.println("lift is openning can not run should be colsed firstly");    }     @Override    public void stop() {        //电梯打开的状态是处于停止状态        System.out.println("lift is in a state of stop");    }}
public class CloseState implements LiftState {    Lift lift;     public CloseState(Lift lift) {        this.lift = lift;    }     @Override    public void open() {        //电梯关闭了再打开,是可以的        System.out.println("lift is openning");        //更新电梯当前状态-->打开        this.lift.setState(lift.getOpenningState());    }     @Override    public void close() {        //电梯的当前状态-->关闭        System.out.println("lift is closed");     }     @Override    public void run() {        //电梯关闭的状态下允许运行        System.out.println("lift is running");        //更新电梯当前状态-->运行        this.lift.setState(lift.getRunningState());    }     @Override    public void stop() {        //电梯门关着,不按楼层,也可以        System.out.println("lift is stopping");        //更新电梯状态-->停止        this.lift.setState(lift.getStoppingState());    }}
public class RunState implements LiftState {    Lift lift;     public RunState(Lift lift) {        this.lift = lift;    }     @Override    public void open() {        //电梯运行的时候不能开门        System.out.println("lift is running can not open");    }     @Override    public void close() {        //电梯运行的时候本来门本来就是关闭的        System.out.println("lift is closing");    }     @Override    public void run() {        //电梯当前状态-->运行        System.out.println(" lift is running");    }     @Override    public void stop() {        //停止运行电梯        System.out.println("lift is stopping");        //更新电梯当前状态-->停止        this.lift.setState(lift.getStoppingState());    }}
public class StopState implements LiftState {    Lift lift;     public StopState(Lift lift) {        this.lift = lift;    }     @Override    public void open() {        //停止状态可以开门        System.out.println("lift is openning");        //更新电梯状态-->打开        this.lift.setState(lift.getOpenningState());    }     @Override    public void close() {        //停止状态门本来就是关闭的        System.out.println("lift is closing");    }     @Override    public void run() {        //停止状态可以继续运行        System.out.println("lift is running");        //更新电梯状态-->运行        this.lift.setState(lift.getRunningState());    }     @Override    public void stop() {        //电梯当前状态-->关闭        System.out.println("lift is stopping");    }}
/** * 定义电梯context */public class Lift {    //定义出电梯的所有状态    private LiftState openningState;    private LiftState closingState;    private LiftState runningState;    private LiftState stoppingState;     public Lift() {        openningState = new OpenState(this);        closingState = new CloseState(this);        runningState = new RunState(this);        stoppingState = new StopState(this);     }     //定义电梯状态    LiftState state;     public void open() {        state.open();    }     public void close() {        state.close();    }     public void run() {        state.run();    }     public void stop() {        state.stop();    }     public void setState(LiftState state) {        this.state = state;    }     public LiftState getOpenningState() {        return openningState;    }     public LiftState getCloseingState() {        return closingState;    }     public LiftState getRunningState() {        return runningState;    }     public LiftState getStoppingState() {        return stoppingState;    } }
class Test3 {    public static void main(String[] args) {        Lift lift = new Lift();        lift.setState(new OpenState(lift));        lift.open();        lift.close();        lift.run();        lift.stop();    }}

Original url: Access
Created at: 2020-09-23 10:14:23
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论