文章出處

索引

意圖

允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。

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 發布于博客園的系列文章,任何未經作者本人同意的人為或爬蟲轉載均為耍流氓。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()