剛開始理解strategy不太好理解(因爲看書的時候跑神了),但state比startegy要容易的多!
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()這種封裝有種service與dao層的樣子!前、後、中間可以添加其他操作,或者權限的控制,而且對外提供一個整齊的接口:switchfire().很完美!!這種思維一定儘快培養起來!!