狀態模式跟策略模式結構一樣,最大的不同狀態模式會根據狀態的不同,切換不同的動作,所以我們會將狀態物件抽離出來
狀態模式定義
物件行為的改變會根據它內部物件的狀態
狀態模式用法
- 物件操作跟他的狀態有相依關係,我們就可以它抽離出來,並在物件運行時,會根據系統狀態還變化它的操作
- 如果程式碼有很多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);
}
}
輸出:
工人七點上班,打開機器!
機器開始運行
中午休息!
機器暫停
中午休息結束!
機器工作中
下班了!
關閉機器
留言
張貼留言