【C#设计模式-状态模式】示例1

爱⌒轻易说出口 提交于 2020-03-01 12:55:02

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

二.状态模式的意图:允许一个对象在其内部状态改变时改变它的行为。

三.状态模式的适用场景:

1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

四.状态模式的实现:

    /// <summary>
    /// 定义接口,封装Context对象在特定状态下的行为
    /// </summary>
    public abstract class AbstractState
    {
        public abstract void handle(Context context);
    }
    /// <summary>
    /// 具体A状态下的对于的行为
    /// </summary>
    public class ConcreteStateA:AbstractState
    {
        public override void handle(Context context)
        {
            Console.WriteLine("当前状态:{0}",this.GetType().ToString());
            //改变状态
            context.State = new ContextStateB();
        }
    }
    /// <summary>
    /// 具体B状态下的对于的行为
    /// </summary>
    public class ContextStateB:AbstractState
    {
        public override void handle(Context context)
        {
            Console.WriteLine("当前状态:{0}",this.GetType().ToString());
            //改变状态为C
            context.State = new ContextStateC();
        }
    }
    /// <summary>
    /// 具体C状态下的对于的行为
    /// </summary>
    public class ContextStateC:AbstractState
    {
        public override void handle(Context context)
        {
            Console.WriteLine("当前状态:{0}", this.GetType().ToString());
            //改变状态为A
            context.State = new ConcreteStateA();
        }
    }
    public class Context
    {
        //Context 类需要维护一个ConcreteState 的实例,这个具体状态类的实例给出了此环境下的对象的现有状态。
        public AbstractState State { get; set; }
 
        public Context(AbstractState state)
        {
            this.State = state;
        }
        public void Request()
        {
            State.handle(this);
        }
    }
    /// <summary>
    /// C#设计模式-状态模式
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Context c = new Context(new ConcreteStateA());
            c.Request();//在 ConcreteStateA 中,我将 Context 的状态切换回 ContextStateB ,
            c.Request();//而 ContextStateB 中,我将 Context 的状态切换回 ContextStateC,
            c.Request();//而 ContextStateC 中,我将 Context 的状态切换回 ConcreteStateA,
            c.Request();//这样便实现了 Context 在 A , B ,C 这三种状态中循环的切换。
        }
    }


五.总结:
在一些情况下,一个对象的行为取决于一个或者是多个动态变化的属性,这些的属性就叫做状态,拥有这些属性的对象称为状态对象,这些对象的状态是从事先定义好的一系列值中取出的,当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统行为也随之改变。状态模式把所研究的对象的行为包装在不同的状态对象里,
每一个状态对象都属于一个抽象状态类的子类,状态模式的意图是让一个对象在其内部状态发生改变时其行为也随之改变。

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