前陣子開發電子化表單相關的程式,剛好使用到狀態模式(State Pattern)。
需求是每張表單有其狀態,每個狀態有對應的處理動作,
因此直覺上可以使用狀態模式的概念來處理。
先上個類別圖:
這邊使用抽象類別StateBase,下方的類別就是實際的狀態,
以請假表單來說,會有初始狀態與主管審核後狀態,
Execute方法代表執行狀態對應的動作,可能是狀態移轉或通知對應的人。
而StateContext是管理狀態的類別,其Request方法呼叫state物件的Execute方法,
並注入執行的state instance,以提供狀態執行所需的環境資訊。
剛好這需求,一開始同事是使用switch case來處理各狀態行為,
我改成狀態模式,避免全部的狀態行為都擠在同一個方法,
後續擴充維護也會容易許多,這也是Open–closed principle的精神。