【设计模式】状态模式

来源:互联网 发布:打击电信网络诈骗作文 编辑:程序博客网 时间:2024/05/21 17:43

状态模式

         State,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

     主要解决:当控制要给对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂判断逻辑简化。


代码结构

结构图

角色

Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态
    /// <summary>    /// Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态    /// </summary>    class Context    {        private State state;        public Context (State state)        {            this.state = state;        }        //可读写的状态属性,用于读取当前状态和设置新状态        public State State        {            get { return state; }            set            {                state = value;                Console.WriteLine("当前状态:" + state.GetType().Name);            }        }        public void Request()        {            state.Handle(this);         //对请求做处理,并设置下一个状态        }    }
State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为
    /// <summary>    /// State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为    /// </summary>    abstract class State    {        public abstract void Handle(Context context);    }
ConcreteState类,具体状态,每一个子系统实现一个与Context的一个状态相关的行为
    /// <summary>    /// ConcreteState类,具体状态,每一个子系统实现一个与Context的一个状态相关的行为    /// </summary>    class ConcreteStateA:State    {        public override void Handle(Context context)        {            context.State = new ConcreteStateB();           //设置 ConcreteStateA的下一个状态是ConcreteStateB        }    }    class ConcreteStateB : State    {        public override void Handle(Context context)        {            context.State = new ConcreteStateA();           //设置 ConcreteStateB的下一个状态是ConcreteStateA        }    }

客户端代码

    class Program    {        static void Main(string[] args)        {            Context c = new Context(new ConcreteStateA());      //设置Context的初始状态为ConcreteStateA                        //不断的请求,同时更改状态            c.Request();            c.Request();            c.Request();            c.Request();            Console.ReadKey();        }    }



好处

     1. 将于特定状态相关的行为局部化,并且将不同状态的行为分割开来。

     2. 消除庞大的条件分支语句

 

使用环境

     当一个对象的行为取决于它的状态,并且它必须在运行是可根据状态改变他的行为时,就可以考虑使用状态模式。

0 0