1. 程式人生 > >狀態模式(State)—考勤系統

狀態模式(State)—考勤系統

定義:

狀態模式是物件的行為模式,允許一個物件在其內部狀態改變時改變他的行為,這個物件看上去就像改變了他的類一樣。

角色:

環境(Context)角色:定義客戶端感興趣的介面,並且保留一個具體狀態類的例項,具體狀態類的例項給出環境類的當前狀態。

抽象狀態(State)角色:定義一個介面,用以封裝環境角色的具體狀態類的行為。

具體狀態(ConcreteState)角色:每一個具體狀態類都實現環境角色的狀態對應的具體行為。

例子:

每個工廠都會有考勤系統,其中對上班遲到的懲罰可分成不同的級別,如果遲到30分鐘之內不扣錢,如果遲到超過30分鐘要扣半天的工資,此時將遲到的行為抽象到介面中,作為抽象狀態角色(State),不同的遲到行為作為具體狀態角色(ConcreteState),環境角色則根據不同的狀態呼叫不同的具體狀態類。

類圖:

程式碼:

/**
 * 環境角色類
 * @author wang
 */
public class Context {
	//持有 一個CardState型別的物件
	private CardState cardState = null;
	
	public void setCardState(CardState cardState){
		this.cardState = cardState;
	}
	
	//轉交抽象類處理
	public void request(String mess){
		cardState.handle(mess);
	}
}

/**
 * 抽象狀態類
 * @author wang
 */
public interface CardState {

	//相應的處理方法
	public void handle(String mess);
	
}

/**
 * 具體狀態類
 * @author wang
 */
public class ConcreteCardStateA implements CardState {

	public void handle(String mess) {
        System.out.println(mess + "遲到30分鐘之內,不扣錢" );
	}

}

/**
 * 具體狀態類
 * @author wang 
 */
public class ConcreteCardStateB implements CardState {

	public void handle(String mess) {
        System.out.println(mess + "遲到超過30分鐘,扣半天工資");
	}

}

/**
 * 客戶端類
 * @author wang
 */
public class Client {

    public static void main(String[] args){
    	//建立狀態
    	CardState state = new ConcreteCardStateA();
    	//建立環境
    	Context context = new Context();
    	//將狀態設定到環境中
    	context.setCardState(state);
    	//請求
    	context.request("我遲到了20分鐘,會有什麼懲罰:");
    	
    	//建立狀態
    	CardState stateB = new ConcreteCardStateB();
    	//將狀態設定到環境中
    	context.setCardState(stateB);
    	//請求
    	context.request("我遲到了40分鐘,會有什麼懲罰:");
    }
	
}
執行結果: