狀態模式

開門、關門、運行、停止。好,我們就用程序來實現一下電梯的動作,先看類圖設
計:

package StateP;

public interface ILift {
    //電梯的4個狀態
    public final static int OPENING_STATE = 1; //敞門狀態
    public final static int CLOSING_STATE = 2; //閉門狀態
    public final static int RUNNING_STATE = 3; //運行狀態
    public final static int STOPPING_STATE = 4; //停止狀態

    public void setState(int state);
    //首先電梯門開啓動作
    public void open();
    //電梯門可以開啓,那當然也就有關閉了
    public void close();
    //電梯要能上能下
    public void run();
    //電梯還要能停下來
    public void stop();
}
package StateP;

public class Lift implements ILift{
    private int state;

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

    //電梯門關閉
    public void close() {
        switch(this.state){
            case OPENING_STATE: //可以關門,同時修改電梯狀態
                this.closeWithoutLogic();
                this.setState(CLOSING_STATE);
                break;
            case CLOSING_STATE: //電梯是關門狀態,則什麼都不做
//do nothing;
                break;
            case RUNNING_STATE: //正在運行,門本來就是關閉的,也什麼都不做
//do nothing;
                break;
            case STOPPING_STATE: //停止狀態,門也是關閉的,什麼也不做
//do nothing;
                break;
        }
    }
    //電梯門開啓
    public void open() {
        //電梯在什麼狀態才能開啓
        switch(this.state){
            case OPENING_STATE: //閉門狀態,什麼都不做
//do nothing;
                break;
            case CLOSING_STATE: //閉門狀態,則可以開啓
                this.openWithoutLogic();
                this.setState(OPENING_STATE);
                break;
            case RUNNING_STATE: //運行狀態,則不能開門,什麼都不做
//do nothing;
                break;
            case STOPPING_STATE: //停止狀態,當然要開門了
                this.openWithoutLogic();
                this.setState(OPENING_STATE);
                break;
        }
    }
    //電梯開始運行起來
    public void run() {
        switch(this.state){
            case OPENING_STATE: //敞門狀態,什麼都不做
//do nothing;
                break;
            case CLOSING_STATE: //閉門狀態,則可以運行
                this.runWithoutLogic();
                this.setState(RUNNING_STATE);
                break;
            case RUNNING_STATE: //運行狀態,則什麼都不做
//do nothing;
                break;
            case STOPPING_STATE: //停止狀態,可以運行
                this.runWithoutLogic();
                this.setState(RUNNING_STATE);
        }
    }
    //電梯停止
    public void stop() {
        switch(this.state){
            case OPENING_STATE: //敞門狀態,要先停下來的,什麼都不做
//do nothing;
                break;
            case CLOSING_STATE: //閉門狀態,則當然可以停止了
                this.stopWithoutLogic();
                this.setState(CLOSING_STATE);
                break;
            case RUNNING_STATE: //運行狀態,有運行當然那也就有停止了
                this.stopWithoutLogic();
                this.setState(CLOSING_STATE);
                break;
            case STOPPING_STATE: //停止狀態,什麼都不做
//do nothing;
                break;
        }
    }
    private void closeWithoutLogic(){
        System.out.println("電梯門關閉...");
    }
    //純粹的電梯開門,不考慮任何條件
    private void openWithoutLogic(){
        System.out.println("電梯門開啓...");
    }
    //純粹的運行,不考慮其他條件
    private void runWithoutLogic(){
        System.out.println("電梯上下運行起來...");
    }
    //單純的停止,不考慮其他條件
    private void stopWithoutLogic(){
        System.out.println("電梯停止了...");
    }
}
package StateP;

public class Client {
    public static void main(String[] args) {
//        ILift lift = new Lift();
////首先是電梯門開啓,人進去
//        lift.open();
////然後電梯門關閉
//        lift.close();
////再然後,電梯運行起來,向上或者向下
//        lift.run();
////最後到達目的地,電梯停下來
//        lift.stop();
        ILift lift = new Lift();
//電梯的初始條件應該是停止狀態
        lift.setState(ILift.STOPPING_STATE);
//首先是電梯門開啓,人進去
        lift.open();
//然後電梯門關閉
        lift.close();
//再然後,電梯運行起來,向上或者向下
        lift.run();
//最後到達目的地,電梯停下來
        lift.stop();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章