1725最少硬幣問題(DP)
阿新 • • 發佈:2020-12-05
State Patterns
GoF定義:使一個物件在其自身狀態發生變化時其行為也對應發生變化。這個物件看起來像是改變了它的類
概念
用事實說話【滑稽】
例子
現實世界:想象在網路連線中,這裡負責連線的物件會有很多種狀態(正在連線、連線成功、連線關閉)
程式碼世界:假設一個系統只能處理固定數量個任務,那麼當一個新任務來,它可能會處理這個任務,也可能會提示任務已滿,當前不能處理這個任務
展示
本例中模擬了開關電視的操作
程式碼
public class StatePattern { public static void main(String[] args) { System.out.println("***State Pattern Demo***\n"); //Initially TV is Off Off initialState = new Off(); TV tv = new TV(initialState); //First time press tv.pressButton(); //Second time press tv.pressButton(); } } class TV { private RemoteControl state; public TV(RemoteControl state) { this.state = state; } public RemoteControl getState() { return state; } public void setState(RemoteControl state) { this.state = state; } public void pressButton() { this.state.pressSwitch(this); } } abstract class RemoteControl { abstract void pressSwitch(TV context); } class On extends RemoteControl { @Override void pressSwitch(TV context) { System.out.println("I am already On .Going to be Off now"); context.setState(new Off()); } } class Off extends RemoteControl { @Override void pressSwitch(TV context) { System.out.println("I am Off .Going to be On now"); context.setState(new On()); } }
Note
- 作為人類,當我們心情不錯的時候,可能在各方面表現會更好,而當我們心情糟糕時,表現會更差。這樣的道理可以應用到這個模式中,即當我們需要物件的狀態改變而其行文發生變化,那麼這個模式很易用
- 注意:如果狀態的數量增加了這個系統的複雜度,那麼會使得程式碼難以維護
思考
狀態模式針對的物件,它應對不同狀況採取的行為是要定義在其它類中(例子中的RemoteControl),物件本身會持有一個這樣的類的物件,當它的狀態被改變,它把自己傳入到控制物件的方法中,此時執行的行為都是基於它改變過後的狀態