OSPF的特殊區域和其他特性
阿新 • • 發佈:2020-08-16
當我們在對某個類的行為進行具體的操作時,往往要進行一些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的判斷的邏輯,由傳入不同物件來取代了,非常符合面向物件的設計思想,同時可以方便地擴充套件新的狀態類,避免了醜陋的邏輯判斷。