處理物件的多種狀態及其相互轉換——狀態模式(四)

Liuwei-Sunny發表於2013-01-20

4 共享狀態

      在有些情況下,多個環境物件可能需要共享同一個狀態,如果希望在系統中實現多個環境物件共享一個或多個狀態物件,那麼需要將這些狀態物件定義為環境類的靜態成員物件

      下面通過一個簡單例項來說明如何實現共享狀態:

      如果某系統要求兩個開關物件要麼都處於開的狀態,要麼都處於關的狀態,在使用時它們的狀態必須保持一致,開關可以由開轉換到關,也可以由關轉換到開。

      可以使用狀態模式來實現開關的設計,其結構如圖5所示:

5 開關及其狀態設計結構圖

      開關類Switch程式碼如下所示:

class Switch {
	private static State state,onState,offState; //定義三個靜態的狀態物件
	private String name;
	
	public Switch(String name) {
		this.name = name;
		onState = new OnState();
		offState = new OffState();
		this.state = onState;
	}

	public void setState(State state) {
		this.state = state;
	}

	public static State getState(String type) {
		if (type.equalsIgnoreCase("on")) {
			return onState;
		}
		else {
			return offState;
		}
	}
		
    //開啟開關
	public void on() {
		System.out.print(name);
		state.on(this);
	}
	
//關閉開關
	public void off() {
		System.out.print(name);
		state.off(this);
	}
}

       抽象狀態類如下程式碼所示:

abstract class State {
	public abstract void on(Switch s);
	public abstract void off(Switch s);
}

       兩個具體狀態類如下程式碼所示:

//開啟狀態
class OnState extends State {
	public void on(Switch s) {
		System.out.println("已經開啟!");
	}
	
	public void off(Switch s) {
		System.out.println("關閉!");
		s.setState(Switch.getState("off"));
	}
}

//關閉狀態
class OffState extends State {
	public void on(Switch s) {
		System.out.println("開啟!");
		s.setState(Switch.getState("on"));
	}
	
	public void off(Switch s) {
		System.out.println("已經關閉!");
	}
}

       編寫如下客戶端程式碼進行測試:

class Client {
	public static void main(String args[]) {
		Switch s1,s2;
		s1=new Switch("開關1");
		s2=new Switch("開關2");
		
		s1.on();
		s2.on();
		s1.off();
		s2.off();
		s2.on();
		s1.on();	
	}
}

       輸出結果如下:

開關1已經開啟!

開關2已經開啟!

開關1關閉!

開關2已經關閉!

開關2開啟!

開關1已經開啟!

       從輸出結果可以得知兩個開關共享相同的狀態,如果第一個開關關閉,則第二個開關也將關閉,再次關閉時將輸出“已經關閉”;開啟時也將得到類似結果。

【作者:劉偉 http://blog.csdn.net/lovelion

相關文章