設計模式源自 GoF 四人組經典著作,分為創建型、結構型、行為型三大類共 23 種。模式乃前人經驗沉澱,非短時間可盡吸收,但建立模式意識、在專案中嘗試應用幾個、體會其價值,是技術成長關鍵。
學習模式常陷入 UML 圖解、意圖、動機、結構等理論條條框框的迷霧中。不如從分析具體程式碼入手,效果更佳。以行為型模式 State 為例,參考 javacoder.net 提供的 GoF 實作原始碼。
public interface State {
public void handle();
}
封裝與 Context 特定狀態相關的行為。
public class ConcreteState1 implements State {
public void handle() {
System.out.println("ConcreteState1.handle() executing");
}
}
public class ConcreteState2 implements State {
public void handle() {
System.out.println("ConcreteState2.handle() executing");
}
}
public class Context {
public static final int STATE_ONE = 0;
public static final int STATE_TWO = 1;
// 關鍵:持有當前狀態物件,預設為 ConcreteState1
private State currentState = new ConcreteState1();
public void request() {
currentState.handle(); // 委派給當前狀態處理
}
public void changeState(int state) {
switch (state) {
case STATE_ONE:
currentState = new ConcreteState1(); // 關鍵點:切換狀態物件
break;
case STATE_TWO:
currentState = new ConcreteState2(); // 關鍵點
break;
}
}
}
public class Client {
public static void main(String[] args) {
Context ctx = new Context();
ctx.request(); // 執行狀態 1 行為
ctx.changeState(Context.STATE_TWO); // 切換狀態
ctx.request(); // 執行狀態 2 行為,結果大不同
}
}
僅 4 個類別檔案即完成 State 模式實作。核心在於 Context 持有 State 介面參考,透過切換具體狀態物件實現「物件在內部狀態改變時改變行為,彷彿修改了其類別」。