状态模式

状态模式:当一个对象的内在状态改变时,其行为也相应改变,这个对象看起来像是改变了其类。

说白了,就是一个对象,在不同的状态下,表现出不同的行为,(例如:人在工作时,心情愉快、生气、烦恼、郁闷等不同的心情下,敲击键盘声音不同,

和人聊天时语气不同,就像变了一个人似的),为了避免在一个对象中增加各种 if 状态分支判断,将状态拆分封装,同时也便于后续扩展(如增加 怒火冲天 心情)。

 

一、UML结构图

 

 

二、示例代码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace 状态模式
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             Context c = new Context(new ConcreteStateA());
13 
14             c.Request();
15             c.Request();
16             c.Request();
17             c.Request();
18 
19             Console.Read();
20 
21         }
22     }
23 
24     public class Context
25     {
26         private State m_CurrentState;
27         /// <summary>
28         /// 当前状态
29         /// </summary>
30         public State CurrentState
31         {
32           get { return m_CurrentState; }
33           set { m_CurrentState = value; 
34             Console.WriteLine("当前状态:"+m_CurrentState.GetType().Name);
35           }
36         }
37 
38         public Context(State state)
39         {
40             m_CurrentState=state;
41         }
42 
43         //执行各个状态的相应的行为
44         public void Request()
45         {
46             m_CurrentState.Handle(this);
47         }
48 
49     }
50 
51     public abstract class State
52     {
53         //定义各状态下,相关的行为
54         public abstract void Handle(Context context);
55     }
56 
57     public class ConcreteStateA : State
58     {
59         public override void Handle(Context context)
60         {
61             //执行当前动作
62             Console.WriteLine(string.Format("正在执行StateA状态"));
63 
64             //执行完毕后,切换为下一个状态
65             context.CurrentState = new ConcreteStateB();
66         }
67     }
68 
69     public class ConcreteStateB : State
70     {
71         public override void Handle(Context context)
72         {
73             //执行当前动作
74             Console.WriteLine(string.Format("正在执行StateB状态"));
75 
76             //执行完毕后,切换为下一个状态
77             context.CurrentState = new ConcreteStateA();
78         }
79     }
80 
81 }
示例代码

执行效果:

 

三、状态模式的好处与用处

好处:

  1、将与特定状态相关的行为局部化,集中处理

  2、将不同状态的行为分隔开来。

 

posted @ 2019-12-02 15:52  秋飘  阅读(123)  评论(0编辑  收藏  举报