C#设计模式——状态模式(State Pattern)

来源:互联网 发布:网通网络测速 编辑:程序博客网 时间:2024/04/30 01:11



一、概述
在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为。如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构的混乱。在这种情况下,就可以使用状态模式来解决问题。
二、状态模式
状态模式允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类。
状态模式的结构图如下
 


Context代表需要改变状态的那个对象,它维护了一个State实例,该实例定义了对象的当前状态。
State定义了一个抽象类或是接口,用以封装与特定状态相关的行为。
ConcreteState实现了State定义的行为。
三、示例
本文实现一个电灯开关状态,以此为例介绍状态模式的应用。
首先定义状态接口

1     public interface LightState2     {3         void PressSwitch(Light light);4     }

接着实现具体的状态

复制代码
 1     public class LightOn : LightState 2     { 3         public void PressSwitch(Light light) 4         { 5             Console.WriteLine("Light Off"); 6             light.State = new LightOff(); 7         } 8     } 9 10     public class LightOff : LightState11     {12         public void PressSwitch(Light light)13         {14             Console.WriteLine("Light On");15             light.State = new LightOn();16         }17     }
复制代码

然后定义拥有该状态的对象即电灯

复制代码
 1     public class Light 2     { 3         public LightState State; 4  5         public Light() 6         { 7             State = new LightOff(); 8         } 9 10         public void PressSwtich()11         {12             State.PressSwitch(this);13         }14     }
复制代码

最后看一下如何调用

复制代码
1     static void Main(string[] args)2     {3         Light light = new Light();4         light.PressSwtich();5         light.PressSwtich();6         light.PressSwtich();7             8         Console.ReadLine();9     } 
复制代码

输出结果如下