public class Door1 extends Observable { public static final int CLOSED = 1; public static final int OPENING = 2; public static final int OPEN = 3; public static final int CLOSING = 4; public static final int STAYOPEN = 5; PRivate int state = CLOSED; //... } status()方法返回傳送門狀態的文字描述,如下所示:
public String status() { switch (state) { case OPENING : return "正在打開"; case OPEN : //... default : return "已關閉"; } } 當用戶點擊傳送帶的按鈕時,傳送帶程序調用Door1對象的click()方法。click()方法模擬圖1所示的狀態裝換過程:
public void click() { if (state == CLOSED) { setState(OPENING); } else if (state == OPENING state == STAYOPEN) { setState(CLOSING); } else if (state == OPEN) { setState(STAYOPEN); } else if (state == CLOSING) { setState(OPENING); } } Door1類的setState()方法向觀察者通知傳送門狀態改變事件,代碼如下:
public class Door2 extends Observable { public final DoorState CLOSED = new DoorClosed(this); // 按照類似方式定義DoorState類型的 // OPENING、OPEN、CLOSING、STAYOPEN對象(略) private DoorState state = CLOSED; // ... } DoorState類是一個抽象類,由子類實現其click()方法。在狀態機中,每一個狀態均有相應的“按下按鈕”操作。修改后的設計中每一個描述狀態的類也有一個click()方法,兩者是一致的。DoorState類處理了其它可能的變換,所以DoorState的子類可以忽略無關的事件,代碼如下:
public abstract class DoorState { protected Door2 door; public DoorState(Door2 door) { this.door = door; } public abstract void click(); public String status() { String s = getClass().getName(); return s.substring(s.lastIndexOf('.') + 1); } public void complete() { } public void timeout() { } } 由上可以看到,現在的status()方法要比修改設計方案之前的status()方法簡單多了。新status()方法返回的結果與修改前版本的結果略有不同,它的狀態信息從類的名稱獲得。假如要返回修改設計方案之前的信息,只需把這些狀態信息分別記錄到DoorState的各個子類中,然后在這個status()方法中直接提取即可。