状态模式(State)

  状态模式,从字面意思上来讲应该是很简单的,就是针对实际业务上的内容,当类的内部的状态发生改变时,给出不同的响应体,就像现实中的人一样,早上没有吃饭,状态不好,上班、上课都会打哈欠,中午了,吃过午饭,又吃太饱了,又有点困意了,到了晚上了,终于下班了,可以好好放松一下了,出去好好耍一耍,针对不同的时间有不同的状态,那么怎么在程序中实现呢,让其在不同的状态下给出不同的响应,使其状态发生改变后行为也发生改变。

  这里我们就可以使用状态模式来实现这种实际存在的问题。

  当一个类的状态发生改变时,伴随着类的行为发生了改变,这样就看起来是类发生了改变,这样的使用就是状态模式,那状态模式使用的场景又是什么呢?一般用于当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同的一系列类当中,可以把负责的逻辑判断简单化。

  模式中使用到的角色主要包含了上下文环境(它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理)、抽象状态(定义一个接口以封装使用上下文环境的的一个特定状态相关的行为)、具体状态(实现抽象状态定义的接口)。

  下面我们简单地看一下其的UML图:

  

  具体的代码实现如下:

  1、抽象状态类:

namespace StateDemo
{
    public abstract class State
    {
        public abstract void Handle(Context context);
    }
}
State

  2、具体状态类:

namespace StateDemo
{
    public class ConcreteStateA:State
    {
        public override void Handle(Context context)
        {
            Console.WriteLine("当前状态为A,触发与A相关的场景");
            context.State = new ConcreteStateB();
        }
    }
}
ConcreteStateA
namespace StateDemo
{
    public class ConcreteStateB:State
    {
        public override void Handle(Context context)
        {
            Console.WriteLine("当前状态为B,触发与B相关的场景");
            context.State = new ConcreteStateA();
        }
    }
}
ConcreteStateB

  3、上下文环境:

namespace StateDemo
{
    public class Context
    {
        private State _state { set; get; }
        public State State
        {
            set { this._state = value; }
            get { return this._state; }
        }

        public Context(State state)
        {
            this._state = state;
        }

        public void Request()
        {
            this._state.Handle(this);
        }
    }
}
Context

  4、Main方法:

namespace StateDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Context context = new Context(new ConcreteStateA());
            context.Request();
            context.Request();
            context.Request();
            Console.ReadKey();
        }
    }
}
Main

  以上是对状态模式的简单介绍,其使用场景是: 当一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态。

  本篇文章状态模式至此,谢谢您收看我的博客。

posted @ 2016-03-28 18:41  Mointor  阅读(265)  评论(0编辑  收藏  举报