设计模式------状态模式

你离开我真会死。 提交于 2020-01-21 09:27:31

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

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

简单实现:

namespace StateMode {
    /// <summary>
    /// State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为
    /// </summary>
    abstract class State {
        public abstract void Handle(Context context);
    }
}


namespace StateMode {
    /// <summary>
    /// Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态
    /// </summary>
    class Context {
        private State state;

        //定义Context的初始状态
        public Context(State state) {
            this.state = state;
        }

        //可读写的状态属性,读取当前状态和设置新状态
        public State State {
            get { return state; }
            set {
                state = value;
                Console.WriteLine("当期状态:" + state.GetType().Name);
            }
        }
        /// <summary>
        /// 对请求处理,并设置下一状态
        /// </summary>
        public void Request() {
            state.Handle(this);
        }
    }
}

namespace StateMode {
    /// <summary>
    /// 具体状态,每一个子类实现一个 与Context的一个 状态 相关的行为
    /// </summary>
    class ConcreteStateA : State{
        public override void Handle(Context context) {
            context.State = new ConcreteStateB();
        }
    }
}

namespace StateMode {
    /// <summary>
    /// 具体状态,每一个子类实现一个 与Context的一个 状态 相关的行为
    /// </summary>
    class ConcreteStateB : State {
        public override void Handle(Context context) {
            context.State = new ConcreteStateA();
        }
    }
}

namespace StateMode {
    class Program {
        static void Main(string[] args) {
            Context c = new Context(new ConcreteStateA());
            c.Request();
            c.Request();
            c.Request();
            c.Request();
            Console.Read();
        }
    }
}

/*输出
当期状态:ConcreteStateB
当期状态:ConcreteStateA
当期状态:ConcreteStateB
当期状态:ConcreteStateA*/

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!