前言:
狀態者模式
優勢在可將複雜的物件狀態條件,以物件方式來減少條件式的判斷程式
可由物件自身的狀態,決定之後的動作行為.
狀態者模式 說明:
需求簡易流程如下
這是一個簡單的訂單流程圖
我們可看到從建立訂單開始->最後判斷成功或取消訂單 看似簡單但需要寫一定程度的判斷條件式,而且也要做一定程度的逆向流程防呆.
這裡先貼上 未使用狀態者模式的程式碼: PaymentContext.cs
1 | public class PaymentContext |
裡面有SetStatus
和 RunProcess
方法
- RunProcess 方法 就是將商品一個往下一個流程推進
- SetStatus 方法 可以改變商品狀態
上面類別中的程式碼 目前有點小複雜但還算簡單,但等日後需求越來越多 後人一直把程式碼寫入Switch case
或if ... else
中就會導致程式碼越來越複雜
這個情境我們可以嘗試使用 State Pattern(狀態者模式)
幫助我們將每個自身狀態封裝到物件裡面,由每個狀態來決定後面動作
我們可發現 每個流程都可以使用 RunningProcee
和 SetSatus
這兩個動作
就可開出一個抽象類別,裡面有這兩個抽象方法,給之後的狀態子類去實現.
1 | public abstract class PaymentSatusBase |
PaymentGate
是給外部呼叫端使用的類別,我們可比較上面之前PaymentContext
類別可看到if....else
全部不見了,
因為狀態封裝到各個類別中了
1 | public class PaymentGate |
如何新建一個流程物件?
- 首先我們需要先取得當前使用者使用的
PaymentGate
引用並傳入建構子當作參數 - 實現Running和SetStatus方法,並將此狀態的邏輯寫上
- 執行完後需要更改下個流程,可以將值賦予給
CurrnetProceess
屬性
1 | public class ProcessSatus : PaymentSatusBase |
說明:
以流程進行中為例子.
他會判斷商品使用超過300元,來決定下個流程 所以我們就把這個邏輯寫在此類中.
另外後面幾個流程比照辦理一一搬入類別中
1 | public class CancelSatus : PaymentSatusBase |
最後外部程式使用如下
1 | Product p = new Product(); |
程式碼放在github上
此文作者:Daniel Shih(石頭)
此文地址: https://isdaniel.github.io/statuspattern/
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!