一、狀態模式
1、狀態模式
狀態模式(State Pattern)是一種行為型模式。 它允許一個對象在其內部狀態改變時改變它的行為。狀態模式把所研究的對象的行為包裝在不同的狀態對象里,每一個狀態對象都屬于一個抽象狀態類的一個子類。狀態模式的意圖是允許一個對象在其內部狀態改變時自動改變它的行為。對象看起來似乎修改了它的類。
2、實現思路
(1)、定義狀態類的規范(行為的方法)
(2)、編寫每一種狀態的實現類(開,關等),實現狀態的規范。如果方法行為結果和當前狀態一致,直接觸發行為方法;如果不一致,需要先修改狀態,在促發行為方法。
(3)、定義實體對象,內置狀態的屬性類。實現促發行為的方法,促發修改狀態的方法等。
二、代碼示例
1、示例場景
電腦的對象,調用打開方法,修改狀態促發行為。調用關閉的方法,修改狀態促發行為。
2、代碼示例
// 1、定位狀態的規范(各種可能的行為方法)
public interface ComputerState {public void turnOn(ComputerContext context);public void turnOff(ComputerContext context);
}
// 2.1、編寫開啟狀態實現類
public class ComputerOnState implements ComputerState {@Overridepublic void turnOn(ComputerContext context) {System.out.println("開啟電腦的行為"); // 之前是開啟狀態一致時,不用切換狀態,直接觸發行為}@Overridepublic void turnOff(ComputerContext context) {context.changeState(new ComputerOffState()); // 不一致,切換狀態System.out.println("關閉電腦的行為"); // 觸發行為}
}
// 2.2、編寫關閉狀態實現類
public class ComputerOffState implements ComputerState {@Overridepublic void turnOn(ComputerContext context) {context.changeState(new ComputerOnState());System.out.println("開啟電腦的行為");}@Overridepublic void turnOff(ComputerContext context) {System.out.println("關閉電腦的行為");}
}
// 3、編寫電腦上下文對象
public class ComputerContext {ComputerState computerState;public ComputerContext(ComputerState computerState){this.computerState = computerState;}public void changeState(ComputerState computerState){this.computerState = computerState;}public void turnOn(){computerState.turnOn(this);}public void turnOff(){computerState.turnOff(this);}
}
// 4、測試public static void main(String[] args) {ComputerContext computerContext = new ComputerContext(new ComputerOffState()); // 初始化為關閉狀態的電腦computerContext.turnOn(); // 實際是改變狀態和促發行為computerContext.turnOn(); computerContext.turnOff();}
運行結果:
總結:
狀態模式,當一個對象狀態改變需要觸發不同的行為操作時比較推薦使用。主要套路就是把所有狀態由原來的單一字段抽成具體的類,通過設置狀態類來觸發對應的行為方法。
學海無涯苦作舟!!!