設置模式-狀態模式

來源:《設計模式之禪》java

定義:當一個對象在改變狀態時容許改變其行爲,這個對象看起來像改變了其類。狀態模式的核心時封裝,狀態的改變引發了行爲的改變,從外部看來好像是這個對象的對應的類發生了改變。設計模式

狀態模式三個角色:ide

  1. State抽象狀態角色:負責對象狀態定義,封裝環境角色以實現狀態切換。this

  2. ConcreteState 具體狀態角色:實現抽象狀態角色定義。具體狀態兩個主要職責,本狀態行爲管理和取向狀態處理。設計

  3. Context 環境角色:定義客戶端須要的接口,負責具體狀態的切換。code

類圖:對象

代碼:接口

抽象狀態it

/**
 * 
 */
package cc.pattern.state;

/**
 * @author rico
 * 抽象狀態
 */
public abstract class State {
	protected Context context;
	
	public void setContext(Context context) {
		this.context = context;
	}
	
	public abstract void handleOne();
	
	public abstract void handlerTwo();
}

具體狀態class

/**
 * 
 */
package cc.pattern.state;

/**
 * @author rico
 * 具體狀態
 */
public class StateOne extends State {

	/* (non-Javadoc)
	 * @see cc.pattern.state.State#handleOne()
	 */
	@Override
	public void handleOne() {
		super.context.setCurrentState(Context.stateTwo);
		super.context.handleOne();
	}

	/* (non-Javadoc)
	 * @see cc.pattern.state.State#handlerTwo()
	 */
	@Override
	public void handlerTwo() {
		System.out.println("###StateOne.handlerTwo...");
	}

}

/**
 * 
 */
package cc.pattern.state;

/**
 * @author rico
 * 具體狀態
 */
public class StateTwo extends State {

	/* (non-Javadoc)
	 * @see cc.pattern.state.State#handleOne()
	 */
	@Override
	public void handleOne() {
		System.out.println("###StateTwo.handleOne...");
	}

	/* (non-Javadoc)
	 * @see cc.pattern.state.State#handlerTwo()
	 */
	@Override
	public void handlerTwo() {
		super.context.setCurrentState(Context.stateOne);
		super.context.handleTwo();
	}

}

上下文

/**
 * 
 */
package cc.pattern.state;

/**
 * @author rico
 * 上下文
 */
public class Context {
	public static final StateOne stateOne = new StateOne();
	public static final StateTwo stateTwo = new StateTwo();
	
	// 當前狀態
	private State currentState;
	
	public void setCurrentState(State state) {
		this.currentState = state;
		this.currentState.setContext(this);
	}
	
	public void handleOne() {
		this.currentState.handleOne();
	}
	
	public void handleTwo() {
		this.currentState.handlerTwo();
	}
	
}

場景類

/**
 * 
 */
package cc.pattern.state;

/**
 * @author rico
 * 場景類
 */ 
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Context context = new Context();
		//context.setCurrentState(new StateTwo());
		context.setCurrentState(new StateOne());
		
		context.handleOne();
		context.handleTwo();
	}

}


狀態模式優勢:

  1. 結構清晰,避免過多的switch 或 if,下降程序的複雜性,提升系統的可維護性。

  2. 遵循了開閉原則和單一原則 。

  3. 封裝性很是好。外部的調用不須要知道類內部狀態和行爲的切換。

狀態模式肯定:

  1.  狀態太多,類回膨脹。

使用場景:

  1. 行爲隨狀態改變的場景。

  2. 條件/分支判斷語句的替代。

擴展:

相關文章
相關標籤/搜索