A little known fact: the Strategy and State Patterns were twins separated at birth. As you know, the Strategy Pattern went on to create a wildly successful business around interchangeable
algorithms. State, however, took the perhaps more noble path of helping objects to control their behavior by changing their internal state. He’s often overheard telling his object clients
狀態模式允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類。這個模式將狀態封裝成為獨立的類,並將動作委托到代表當前狀態的對象。使得行為會隨著內部狀態的改變而改變。封裝基於狀態的行為,並將行為委托到當前狀態。
策略模式的類圖與狀態模式的類圖是一樣的。當它們的意圖不一樣:
以狀態模式而言,我們將一群算法封裝在狀態對象中,context的行為隨時可以委托到那些狀態對象中的一個。隨著時間的流逝,當前狀態在狀態對象集合中游走改變,以反映出context內部的狀態。因此,context的行為也會隨著變化。但是context的客戶對於狀態對象了解不多,甚至是渾然不覺。我們把狀態模式想成是不用在context中放置許多條件判斷的替代方案。通過在context內簡單地改變狀態對象來改變context的行為。
而以策略模式而言,客戶通常主動指定context所要組合的策略對象是哪一個。對於某個context對象來說,通常都只有一個最適當的策略對象。一般來說,我們把策略模式想成是除了繼承之外的一種彈性替代方案。如果你使用繼承定義一個類的行為,你將被這個行為困住,甚至要修改它都難。有了策略模式,你可以通過組合不同的對象來改變行為。
在個別的狀態類中封裝狀態行為,結果總是增加這個設計中類的個數。這就是為了要獲取彈性而付出的代價。