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

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

UML

在这里插入图片描述

实现

    abstract class State
    {
        public abstract void Handle(Context context);
    }
    //具体状态类,每一个子类实现一个与Context的一个状态相关的行为
    class ConcreteStateA:State
    {
        public override void Handle(Context context)
        {
            context.State = new ConcreteStateB();   //状态转换,即A的下一状态为B
        }
    }
    class ConcreteStateB : State
    {
        public override void Handle(Context context)
        {
            context.State = new ConcreteStateA();   //状态转换,即B的下一状态为A
        }
    }

    //Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态
    class Context
    {
        private State state;
        //定义Context的初始状态
        public Context(State state)
        {
            this.state = state;
        }
        //可读写的状态属性,用于读取当前状态和设置新状态
        public State State {
            get { return state; }
            set {
                state = value;
                Console.WriteLine("current state:" + state.GetType().Name);
            }
        }
        //对请求做处理,并设置下一状态
        public void Request()
        {
            state.Handle(this);
        }

    }
    //客户端
    static void Main(string[] args) {
            Context c = new Context(new ConcreteStateA());

            //不断的请求,同时更改状态
            c.Request();
            c.Request();
            c.Request();

            Console.Read();
        }

输出

current state:ConcreteStateB
current state:ConcreteStateA
current state:ConcreteStateB

总结

  1. 状态模式的好处

状态模式的好处是将于特定状态相关的行为局部化,并且讲不同状态的行为分割开来[DP]
将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的状态都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。[DP]

  1. 什么时候考虑使用状态模式?

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

  1. 在Unity中的应用
    http://blog.csdn.net/poem_qianmo/article/details/52824776

参考文献

[1] 大话设计模式