文章出處
文章列表
索引
允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。
Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
Context
- 定義客戶感興趣的接口。
- 維護一個 ConcreteState 子類的實例,這個實例定義當前狀態。
State
- 定義一個接口以封裝與 Context 的一個特定狀態相關的額行為。
ConcreteState
- 每一個子類實現一個與 Context 的一個狀態相關的行為。
在以下情況下可以使用 State 模式:
- 一個對象的行為取決于它的狀態,并且它必須在運行時根據狀態改變它的行為。
- 一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。
- 它將與特定狀態相關的行為局部化。
- 它使得狀態轉換顯式化。
- State 對象可被共享。
- 使用 Flyweight 模式共享狀態對象。
- 使用 Singleton 模式實現狀態對象。
實現方式(一):由 ConcreteState 指定它的后繼 State。
State 模式不指定哪一個參與者定義狀態轉換規則。
如果該轉換規則是固定的,那么它們可在 Context 中完全實現。
然而若讓 State 子類自身指定它們的后繼狀態以及何時進行轉換,通常更為靈活。
這需要 Context 增加一個接口,可以顯示地設定 State。
這種實現的缺點是,一個 State 子類至少擁有一個其他子類的信息,使子類間產生了依賴。
1 namespace StatePattern.Implementation1 2 { 3 public abstract class State 4 { 5 public abstract string Name { get; } 6 public abstract void Handle(Context context); 7 } 8 9 public class Context 10 { 11 private State _state; 12 13 public Context() 14 { 15 } 16 17 public void SetState(State state) 18 { 19 _state = state; 20 Console.WriteLine("Current State: {0}", _state.Name); 21 } 22 23 public void Request() 24 { 25 _state.Handle(this); 26 } 27 } 28 29 public class ConcreteStateA : State 30 { 31 public override string Name { get { return "StateA"; } } 32 33 public override void Handle(Context context) 34 { 35 Console.WriteLine(Name + " is handling context."); 36 37 // change context state 38 context.SetState(new ConcreteStateB()); 39 } 40 } 41 42 public class ConcreteStateB : State 43 { 44 public override string Name { get { return "StateB"; } } 45 46 public override void Handle(Context context) 47 { 48 Console.WriteLine(Name + " is handling context."); 49 50 // change context state 51 context.SetState(new ConcreteStateA()); 52 } 53 } 54 55 public class Client 56 { 57 public void TestCase1() 58 { 59 var context = new Context(); 60 context.SetState(new ConcreteStateA()); 61 62 context.Request(); 63 context.Request(); 64 } 65 } 66 }
《設計模式之美》為 Dennis Gao 發布于博客園的系列文章,任何未經作者本人同意的人為或爬蟲轉載均為耍流氓。
文章列表
全站熱搜