1. 程式人生 > 實用技巧 >OSPF的特殊區域和其他特性

OSPF的特殊區域和其他特性

當我們在對某個類的行為進行具體的操作時,往往要進行一些if else的判斷,來確定物件中某些引數的狀態,從而執行不同的行為。當判斷的引數較多時,大量的if else就會變得很難維護,此時就需要用狀態模式來處理了。

狀態模式的核心思想是將物件的狀態抽象出來,抽象的不同實現表示不同的狀態。然後把物件的行為包裝在不同的狀態物件裡,這樣,我們傳入不同的狀態物件,原物件的具體行為就會發生改變。

例如,電梯的執行就可以分為不同的狀態。我們建立如下介面來定義電梯的常見操作:

/**
 * 狀態控制介面——電梯控制介面
 */
public interface ElevatorController {

    
//開啟電源 void powerOn(); //關閉電源 void powerOff(); //開門 void openDoor(); //關門 void closeDoor(); //前往某個樓層 void goToFloor(int floor); }

其中,開門,關門,前往某個樓層這幾個操作在電梯的不同狀態會有不同的行為。如正在上下執行時無法開門或關門,電源關閉時這三個操作都不能執行等。

建立介面來定義要包裝到狀態物件中的行為:

/**
 * 狀態模式——電梯狀態介面
 * 定義所有的操作,根據不同的狀態,在實現類中對方法有不同的具體實現
 
*/ public interface ElevatorState { void openDoor(); void closeDoor(); void goToFloor(int floor); }

建立狀態的實現類,如電梯執行中,電梯暫停中,電梯停運:

/**
 * 狀態實現類——電梯執行中
 */
public class ElevatorInOperation implements ElevatorState {

    private ElevatorInOperation() {
    }

    public static ElevatorInOperation getInstance() {
        
return InstanceHolder.instance; } @Override public void openDoor() { System.out.println("can not open the door in operation!"); } @Override public void closeDoor() { System.out.println("can not close the door in operation!"); } @Override public void goToFloor(int floor) { System.out.println("will go to " + floor + " floor"); } private static class InstanceHolder { private static ElevatorInOperation instance = new ElevatorInOperation(); } }
/**
 * 狀態實現類——電梯暫停中
 */
public class ElevatorInPause implements ElevatorState {

    private ElevatorInPause() {
    }

    public static ElevatorInPause getInstance() {
        return InstanceHolder.instance;
    }

    @Override
    public void openDoor() {
        System.out.println("open the door successful");
    }

    @Override
    public void closeDoor() {
        System.out.println("close the door successful");
    }

    @Override
    public void goToFloor(int floor) {
        System.out.println("will go to " + floor + " floor");
    }

    private static class InstanceHolder {
        private static ElevatorInPause instance = new ElevatorInPause();
    }
}
/**
 * 狀態實現類——電梯停運中
 */
public class ElevatorInStop implements ElevatorState {

    private ElevatorInStop() {
    }

    public static ElevatorInStop getInstance() {
        return InstanceHolder.instance;
    }

    @Override
    public void openDoor() {
        System.out.println("can not open the door in stop!");
    }

    @Override
    public void closeDoor() {
        System.out.println("can not close the door in stop!");
    }

    @Override
    public void goToFloor(int floor) {
        System.out.println("can not add floor in stop!");
    }

    private static class InstanceHolder {
        private static ElevatorInStop instance = new ElevatorInStop();
    }
}

這裡我們只簡單地列印了操作資訊來代表行為的具體實現。最後再建立電梯控制介面的實現:

/**
 * 狀態控制實現類——電梯控制實現類
 */
public class ElevatorControllerImpl implements ElevatorController {

    private ElevatorState mState;

    public void setState(ElevatorState mState) {
        this.mState = mState;
    }

    @Override
    public void powerOn() {
        setState(ElevatorInPause.getInstance());
        System.out.println("elevator is on");
    }

    @Override
    public void powerOff() {
        setState(ElevatorInStop.getInstance());
        System.out.println("elevator is off");
    }

    @Override
    public void openDoor() {
        mState.openDoor();
    }

    @Override
    public void closeDoor() {
        mState.closeDoor();
    }

    @Override
    public void goToFloor(int floor) {
        if (!(mState instanceof ElevatorInStop)) {
            setState(ElevatorInOperation.getInstance());
            System.out.println("will go to " + floor + " floor");
        }
        mState.goToFloor(floor);
    }
}

電梯控制實現類持有狀態抽象的引用,行為方法中,狀態類實現的操作就需要呼叫狀態的行為方法,或傳入其它的狀態物件來改變電梯的狀態。可以看到,本身需要多個if else的判斷的邏輯,由傳入不同物件來取代了,非常符合面向物件的設計思想,同時可以方便地擴充套件新的狀態類,避免了醜陋的邏輯判斷。