狀態模式
允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。
狀態模式UML圖
上下文環境(Context):它定義了客戶程序需要的接口並維護一個具體狀態角色的實例,將與狀態相關的操作委托給當前的Concrete State對象來處理。
抽象狀態(State):定義一個接口以封裝使用上下文環境的的一個特定狀態相關的行為。
具體狀態(Concrete State):實現抽象狀態定義的接口。
狀態模式代碼
package com.roc.state; public class Context { private State state; public Context(State state){ this.state=state; } public State getState() { return state; } public void setState(State state) { this.state = state; } public void stateChange(){ state.action(this); } }
package com.roc.state; /** * 抽象狀態類 * @author liaowp * */ public abstract class State { public abstract void action(Context context); }
package com.roc.state; public class OpenSate extends State{ public void action(Context context) { System.out.println("開"); context.setState(new CloseState()); } }
package com.roc.state; public class CloseState extends State{ public void action(Context context) { System.out.println("關"); context.setState(new OpenSate()); } }
package com.roc.state; /** * 狀態模式 * @author liaowp * */ public class Client { public static void main(String[] args) { Context context=new Context(new CloseState()); context.stateChange(); context.stateChange(); context.stateChange(); context.stateChange(); context.stateChange(); context.stateChange(); context.stateChange(); context.stateChange(); } }
狀態模式適用場景
狀態模式將與特定狀態相關的行為局部化,並且將不同狀態的行為分割開來。
所有狀態相關的代碼都存在於某個ConcereteState中,所以通過定義新的子類很容易地增加新的狀態和轉換。
狀態模式通過把各種狀態轉移邏輯分不到State的子類之間,來減少相互間的依賴。