設計模式-12-狀態模式

狀態模式:

原理:一個對象在其內部狀態改變的時候改變其行爲

結構:
環境角色(Context):定義客戶端感興趣的接口,並保留一個具體狀態類的實例
抽象狀態角色(State):定義一個接口,用以封裝環境對象的一個特定狀態所對應的行爲
具體狀態角色(ConcreteState):每一個具體狀態類都實現了環境的一個狀態所對應的行爲

一個環境角色包含抽象狀態角色的引用,然後在不同的情況下實例不同的具體狀態角色,實現不一樣的行爲

代碼實例

抽象狀態角色
public interface StateInterface {
	public void handler(String src);
}

具體狀態角色1
public class concreteState1 implements StateInterface{

	@Override
	public void handler(String src) {
		// TODO Auto-generated method stub
		System.out.println("concreteState1"+src);
	}

}
具體狀態角色2
public class concreteState2 implements StateInterface{

	@Override
	public void handler(String src) {
		// TODO Auto-generated method stub
		System.out.println("concreteState2"+src);
		
	}

}
具體狀態角色3
public class concreteState3 implements StateInterface{

	@Override
	public void handler(String src) {
		// TODO Auto-generated method stub
		System.out.println("concreteState3"+src);
		
	}

}

環境角色
public class Context {
	//環境的引用
	private StateInterface stateInterface;
	//模擬在不同的環境下實例不同的具體抽象角色
	public void setConcreteStateInterface(StateInterface stateInterface){
		this.stateInterface = stateInterface;
	}
	//提供一個方法調用具體抽象角色在不同狀態下的行爲
	public void request(String src){
		
		stateInterface.handler(src);
		
	}

}

客戶端
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			Context context = new Context();
			
			StateInterface stateInterface1 = new concreteState1();
			StateInterface stateInterface2 = new concreteState2();
			StateInterface stateInterface3 = new concreteState3();
			
			context.setConcreteStateInterface(stateInterface1);
			context.request("第一個狀態");
			
			context.setConcreteStateInterface(stateInterface2);
			context.request("第二個狀態");
			
			context.setConcreteStateInterface(stateInterface3);
			context.request("第三個狀態");
	}

}

運行結果
concreteState1第一個狀態
concreteState2第二個狀態
concreteState3第三個狀態

總結:

1.狀態模式適用於一個對象的行爲取決於它的狀態,並且它必須在運行的時刻根據狀態改變它的行爲
2.狀態模式將狀態的邏輯處理變化由上下文對象Context管理,便於客戶端的調用


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