處理物件的多種狀態及其相互轉換——狀態模式(四)
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】
相關文章
- 處理物件的多種狀態及其相互轉換——狀態模式(五)物件模式
- 處理物件的多種狀態及其相互轉換——狀態模式(一)物件模式
- [ARM] ARM處理器的7種工作模式和2種工作狀態模式
- 程式的狀態與轉換
- 狀態模式模式
- 工作流從無狀態切換到有狀態的好處
- informix CKPT REQ 狀態處理!ORM
- synchronized四種鎖狀態的升級synchronized
- css中按鈕的四種狀態CSS
- SSH框架之-hibernate 三種狀態的轉換框架
- 理解 TCP(四):狀態流轉TCP
- 【演算法】狀態之美,TCP/IP狀態轉換探索演算法TCP
- 轉載---Dephi狀態模式(State模式)模式
- LINUX netstat連線狀態解析及TCP狀態轉換LinuxTCP
- JavaStatePattern(狀態模式)JavaAST模式
- JS 狀態模式JS模式
- (三)狀態模式模式
- 狀態模式(State)模式
- WebRTC ICE 狀態與提名處理Web
- React 4 種狀態型別及 N 種狀態管理React型別
- Java執行緒狀態轉換Java執行緒
- 用設計模式去掉沒必要的狀態變數 —— 狀態模式設計模式變數
- Hibernate物件狀態物件
- Vuex 單狀態庫 與 多模組狀態庫Vue
- 5 個處理狀態列的函式函式
- 巧用狀態值處理複雜的 TableViewView
- RAC中unknown 狀態的處理方式
- 程式的3種狀態
- hibernate中po物件的三種狀態分析物件
- 簡述oracle日誌組的四種狀態Oracle
- 設計模式-狀態模式設計模式
- 設計模式:狀態模式設計模式
- 23種設計模式(七)-狀態設計模式設計模式
- 狀態變化模式模式
- 狀態模式(State pattern)模式
- 17_狀態模式模式
- 5種狀況下的HTTP狀態碼HTTP
- Oracle 資料庫的各種狀態和模式Oracle資料庫模式