行为型设计模式——状态模式

允许一个对象的内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

适用于

①一个对象的行为决定了它的状态,并且它必须在运行时刻改变状态改变他的行为。

②一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态常用一个或者多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得开发者可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象独立变化。

类图如下

 

 1     internal class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Elevator elevator = new Elevator();
 6 
 7             elevator.OpenDoor();
 8             elevator.CloseDoor();
 9             elevator.Run();
10             elevator.Stop();
11             
12             //改变状态
13             elevator.SetState(new StopState(elevator));
14 
15             elevator.CloseDoor();
16             elevator.Run();
17             elevator.OpenDoor();
18             elevator.Stop();
19 
20         }
21     }
 1     /// <summary>
 2     /// 状态接口
 3     /// </summary>
 4     internal interface IState
 5     {
 6         void OpenDoor();
 7         void CloseDoor();
 8         void Run();
 9 
10         void Stop();
11     }
 1     /// <summary>
 2     ///电梯类,聚合了状态类,用来进行状态变换
 3     /// </summary>
 4     internal class Elevator
 5     {
 6         private IState state;
 7 
 8         public Elevator()
 9         {
10             state = new StopState(this);
11         }
12 
13         public void SetState(IState state)
14         {
15             this.state = state;
16         }
17 
18         public void OpenDoor()
19         {
20             state.OpenDoor();
21         }
22 
23         public void CloseDoor()
24         {
25             state.CloseDoor();
26         }
27 
28         public void Run()
29         {
30             state.Run();
31         }
32 
33         public void Stop()
34         {
35             state.Stop();
36         }
37     }
View Code
 1     /// <summary>
 2     /// 停止状态
 3     /// </summary>
 4     internal class StopState : IState
 5     {
 6         private Elevator context;
 7 
 8         public StopState(Elevator context)
 9         {
10             this.context = context;
11         }
12 
13         public void OpenDoor()
14         {
15             Console.WriteLine("电梯门已打开。。。。");
16         }
17 
18         public void CloseDoor()
19         {
20             Console.WriteLine("电梯门已关闭。。。。");
21         }
22 
23         public void Run()
24         {
25             Console.WriteLine("电梯开始运行。。。");
26             //切换到运行状态
27             context.SetState(new RunState(context));
28         }
29 
30         public void Stop()
31         {
32             Console.WriteLine("电梯已停止。。。");
33         }
34     }
View Code
 1     /// <summary>
 2     /// 运行状态
 3     /// </summary>
 4     internal class RunState : IState
 5     {
 6         private Elevator context;
 7 
 8         public RunState(Elevator context)
 9         {
10             this.context = context;
11         }
12         public void CloseDoor()
13         {
14             Console.WriteLine("电梯正在运行,门是关闭的。。。");
15         }
16 
17         public void Run()
18         {
19             Console.WriteLine("电梯继续运行。。。");
20         }
21 
22         public void OpenDoor()
23         {
24             Console.WriteLine("电梯正在运行,无法开门。。。");
25         }
26 
27         public void Stop()
28         {
29             Console.WriteLine("电梯开始关闭。。。");
30             //切换到停止状态
31             context.SetState(new RunState(context));
32         }
33     }
View Code
 1     /// <summary>
 2     /// 故障状态
 3     /// </summary>
 4     internal class FaultState : IState
 5     {
 6         private Elevator context;
 7 
 8         public FaultState(Elevator context)
 9         {
10             this.context = context;
11         }
12         public void CloseDoor()
13         {
14             Console.WriteLine("电梯故障,无法关门。。。");
15         }
16 
17         public void OpenDoor()
18         {
19             Console.WriteLine("电梯故障,无法开门。。。");
20         }
21 
22         public void Run()
23         {
24             Console.WriteLine("电梯故障,无法启动。。。");
25         }
26 
27         public void Stop()
28         {
29             Console.WriteLine("电梯故障,已被强制关闭。。。");
30         }
31     }
View Code

 

posted @ 2025-05-06 21:46  是铭不是明  阅读(13)  评论(0)    收藏  举报