State模式學習

剛開始理解strategy不太好理解(因爲看書的時候跑神了),statestartegy要容易的多!


State模式用作開關的轉換,UML圖如上,包含:一個接口Istate,幾個實現接口的狀態類,一個對外開放的狀態調節fireSwitch類(對外使用,贊封裝的思維!),一個測試類。

IState接口:

public interfaceIState {

publicvoid switchFire(FireSwitch sw);

}

狀態類,這裏只寫一個,其他的都一樣只是new出來的狀態不同而已,狀態總共有:OffState,SmallState,MediumState,LargeState幾個是需要進行互相轉換的類:

public classLargeState implements IState{

public voidswitchFire(FireSwitch sw) {

sw.setState(newOffState());

System.out.println("offfire");

}}

對外提供功能、調節狀態的類FireSwitch:

public classFireSwitch {

private IState current;//接口類對象,用來進行各個狀態的轉換;

public FireSwitch(){

current = new OffState();//用關閉狀態作爲初始化的狀態

}

public voidsetState(IState s) {

current = s;//此可用於spring中進行注入,但是好像用處不大,應該對應有個getState,此處略去~

}

public voidswitchFire() {

current.switchFire(this);//進行狀態轉換,每個狀態的轉換都寫死在各個狀態的內部,所以這個只要調用相應狀態的switchFire函數就可以進行轉換,並且轉換到已設定好的狀態下!比較死,但是在某種特定情況下還是很好的用,比如手動的微波爐的開火的調節,或者如TCP那樣有精準的狀態轉換的邏輯就很好用,若否,則這個比strategy模式要笨一些,因爲其下一狀態是寫死的,不是向後者一樣可以通過用戶傳參進來進行相應的操作!

}}

測試方法:

@Test//此處因爲封裝的比較好,所以直接調用fireswitch類即可,而不是需要調用整個IState,及各個狀態類;

//所以,若你有接口及其實現類時,要封裝一個這樣對外使用的類,用起來纔會比較舒服!

public voidtestFireSwitch() {

FireSwitchfireSwitch = new FireSwitch();

fireSwitch.switchFire();

fireSwitch.switchFire();

fireSwitch.switchFire();

fireSwitch.switchFire();

}

FireSwitch中的switchFire()調用IState中的switchfire()這種封裝有種servicedao層的樣子!前、後、中間可以添加其他操作,或者權限的控制,而且對外提供一個整齊的接口:switchfire().很完美!!這種思維一定儘快培養起來!!

發佈了66 篇原創文章 · 獲贊 9 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章