状态模式:当一个对象的内在状态改变时,其行为也相应改变,这个对象看起来像是改变了其类。
说白了,就是一个对象,在不同的状态下,表现出不同的行为,(例如:人在工作时,心情愉快、生气、烦恼、郁闷等不同的心情下,敲击键盘声音不同,
和人聊天时语气不同,就像变了一个人似的),为了避免在一个对象中增加各种 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、将不同状态的行为分隔开来。