博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
状态模式(State)
阅读量:5029 次
发布时间:2019-06-12

本文共 2045 字,大约阅读时间需要 6 分钟。

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

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

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

  模式中使用到的角色主要包含了上下文环境(它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的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

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

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

转载于:https://www.cnblogs.com/mointor/p/5330142.html

你可能感兴趣的文章
Centos7下载和安装教程
查看>>
无谓的通宵加班之后的思索
查看>>
S1的小成果:MyKTV系统
查看>>
从setting文件导包
查看>>
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>
union和union all
查看>>
Github 开源:使用控制器操作 WinForm/WPF 控件( Sheng.Winform.Controls.Controller)
查看>>
PMD使用提醒
查看>>
Codeforces 887D Ratings and Reality Shows
查看>>
论文《A Generative Entity-Mention Model for Linking Entities with Knowledge Base》
查看>>
CentOS 6.7编译安装PHP 5.6
查看>>
Linux记录-salt分析
查看>>
Android Studio默认快捷键
查看>>
发布开源库到JCenter所遇到的一些问题记录
查看>>
第七周作业
查看>>
函数式编程与参数
查看>>
flush caches
查看>>
SSAS使用MDX生成脱机的多维数据集CUB文件
查看>>
ACM_hdu1102最小生成树练习
查看>>
MyBatis源码分析(一)--SqlSessionFactory的生成
查看>>