《Design Patterns》State.積跬步系列

State:狀態模式

先代碼

父類或接口類:

package h.l.demo.state;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年2月29日
 * @Description: 抽象狀態類
 */
public abstract class State {
	// 處理行爲
	public abstract void handle(Context context); 
}

子類或實現類(兩個):

package h.l.demo.state;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年2月29日
 * @Description: 具體實現類	具體狀態
 */
public class ConcreteStateA extends State {

	@Override
	public void handle(Context context) {
		context.setState(new ConcreteStateB());
	}

}
package h.l.demo.state;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年2月29日
 * @Description: 具體實現類	具體狀態
 */
public class ConcreteStateB extends State {

	@Override
	public void handle(Context context) {
		context.setState(new ConcreteStateA());
	}

}

Context類,維護一個ConcreteState子類的實例,這個實例定義當前的狀態:

package h.l.demo.state;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年2月29日
 * @Description: 維護一個ConcreteState子類的實例,這個實例定義當前的狀態
 */
public class Context {

	private State state;
	public void setState(State state) {
		this.state = state;
		System.out.println("當前state來自:" + state.getClass().getName());
	}
	
	public void request(){
		state.handle(this);
	}
}

測試類:

package h.l.demo.state;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 測試
 */
public class TestMainEnter {

	public static void main(String[] args) {
		Context context =new Context();
		context.setState(new ConcreteStateA());
		context.request();
		context.request();
		context.request();
		context.request();
		context.request();
		context.request();
		context.request();
	}

}

測試結果:
在這裏插入圖片描述

後分析

  • 個人建議:寫代碼是件幸福的事,So,do it

狀態模式,當一個對象的內在狀態改變時允許改變其行爲,這個對象看起來像是改變了其類。簡單說,就是如上述例子所示,Context類中的state屬性一旦通過setState()方法被重新設置了,Context實例再調用request()方法時,其實際的行爲就被改變了,request()方法中執行的語句不再是原先State對象中handler方法了。總結:狀態模式指的是狀態變了,行爲就變了。
狀態模式主要解決的是當前控制一個對象狀態轉換的條件表達式過於複雜的情況。把狀態的判斷邏輯轉移到表示不同的一列類當中,可以把複雜的判斷邏輯簡化。
什麼時候用狀態模式呢?當一個對象的行爲取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行爲時,就可以考慮使用狀態模式了。另外如果業務需求某項業務有多個狀態,狀態變化依靠大量的多分支判斷語句實現,這時就應該考慮到將每一種業務狀態定義爲一個State的子類,這樣這些對象就可以不依賴於其他對象而獨立變化了。某一天客戶需要改變需求,增加或者減少業務狀態或改變狀態模式都可以使用該模式了。
現實中:狀態模式在每一位小夥伴身上可以使用,如:大家每天都會遇到何種各樣的問題,不同的問題帶給我們的感受不一樣。這也是狀態模式的一個體現。在代碼中,如存在多個if else判斷,邏輯判斷過於複雜,我們就可以將這種行爲抽象出來使用狀態模,將邏輯寫在不同的類中。

其他例子:參考自《大話設計模式》無盡加班何時休案例


注:以上文章僅是個人總結,若有不當之處,望不吝賜教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章