zoukankan      html  css  js  c++  java
  • 状态模式(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

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

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

  • 相关阅读:
    多项式多点求值和插值
    Java Dao设计模式
    (转)HTTP长连接和短连接
    JavaScript——this关键字
    JavaScript——Prototype详探
    JavaScript——特殊点总结
    JavaScript——正则表达式
    JavaScript——Window对象
    JavaScript——this、constructor、prototype
    JavaScript——事件模型
  • 原文地址:https://www.cnblogs.com/mointor/p/5330142.html
Copyright © 2011-2022 走看看