狀態模式跟策略模式結構一樣,最大的不同狀態模式會根據狀態的不同,切換不同的動作,所以我們會將狀態物件抽離出來
狀態模式定義
物件行為的改變會根據它內部物件的狀態
狀態模式用法
- 物件操作跟他的狀態有相依關係,我們就可以它抽離出來,並在物件運行時,會根據系統狀態還變化它的操作
- 如果程式碼有很多if-else跟物件狀態有關,可以利用狀態模式來簡化程式設計
狀態模式例子
下面我們以生產機器為例子,機器的狀態有開始、停止、暫停與工作中四種狀態,會根據工人日常作業,1.上班時,會開啟機器為開機;2.中午休息會將機器切換暫停;3.當下班時,會將基季
/** * name: State * description:: 定義系統的狀態為開始]、停止、暫停與工作中 * Created by bryant on 2017/1/12 */ public class State { public enum SystemState {STOP, SUSPEND, WORKING, START } public SystemState systemState =SystemState.STOP ; public void setState(SystemState systemState){ this.systemState = systemState; } }
/** * name: StartState * description: 打開機器狀態 * Created by bryant on 2017/1/12 */ public class StartState implements Machine { @Override public void operate(State state) { System.out.println("機器開始運行") ; state.setState(State.SystemState.START); } }
/** * name: StopState * description: 關閉機器狀態 * Created by bryant on 2017/1/12 */ public class StopState implements Machine { @Override public void operate(State state) { System.out.println("關閉機器") ; state.setState(State.SystemState.STOP); } }
/** * name: SuspendState * description:: 機器暫停 * Created by bryant on 2017/1/12 */ public class SuspendState implements Machine { @Override public void operate(State state) { System.out.println("機器暫停") ; state.setState(State.SystemState.SUSPEND); } }
/** * name: SuspendState * description:: 機器暫停 * Created by bryant on 2017/1/12 */ public class WorkState implements Machine { @Override public void operate(State state) { System.out.println("機器工作中") ; state.setState(State.SystemState.WORKING); } }
/** * name: Machine * description: 定義狀態介面用來連接動作和狀態 * Created by bryant on 2017/1/12 */ public interface Machine { public void operate(State state ); }
/** * name: MachineDemo * description: 測試狀態模式 * Created by bryant on 2017/1/12 */ public class MachineDemo { public static void main(String[] args){ System.out.println("工人七點上班,打開機器!"); State state = new State(); Machine startMachine = new StartState(); startMachine.operate(state); System.out.println("中午休息!"); Machine suspendMachine = new SuspendState(); suspendMachine.operate(state); System.out.println("下班了!"); Machine stopMachine = new StopState(); stopMachine.operate(state); } }
輸出:
工人七點上班,打開機器!
機器開始運行
中午休息!
機器暫停
中午休息結束!
機器工作中
下班了!
關閉機器
留言
張貼留言