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

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

好处:将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。

使用时机:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时。例如:FSM有限状态机


 class Program{static void Main(string[] args){//Context c = new Context(new ConcreteStateA());    //原始的状态模式                 //执行过程:1.实例化Context对象,给定初始对象ConcreteStateA;                                                                                 //          2.此时Context中的State为ConcreteStateA;第一次 c.Request()方法执行时,调用了ConcreteStateA的Handle()方法,将Context的State变成了 new ConcreteStateB(),//c.Request();                                                                       //            同时触发了State中属性改变值时的方法;//c.Request();                                                                       //          3.此时Context中的State为ConcreteStateB;第一次 c.Request()方法执行时,调用了ConcreteStateB的Handle()方法,将Context的State变成了 new ConcreteStateA(),//c.Request();                                                                       //            同时触发了State中属性改变值时的方法;//c.Request();                                                                       //          4.下几步,逻辑相同。//Console.Read();Work emergencyProjects = new Work();              //带例子的状态模式                   //执行过程:1.实例化Work对象;emergencyProjects.Hour = 9;                                                            //          2.修改实例化后的对象的Hour,用于后面的判断;emergencyProjects.WriteProgram();                                                      //          3.执行实例化后的对象中的WriteProgram方法,由于WriteProgram方法的执行与传递通过SetState方法传递其中的current有关,故存在动态转变过程;emergencyProjects.Hour = 10;                                                           //          4.根据Hour或TaskFinished这一判断条件,判断是否通过SetState方法动态转变current的对象;emergencyProjects.WriteProgram();                                                      //          5.如果需要切换,则执行新的对象的WriteProgram方法。emergencyProjects.Hour = 12;                                                          emergencyProjects.WriteProgram();                                                      emergencyProjects.Hour = 13;emergencyProjects.WriteProgram();emergencyProjects.Hour = 14;emergencyProjects.WriteProgram();emergencyProjects.Hour = 17;emergencyProjects.WriteProgram();emergencyProjects.TaskFinished = false;emergencyProjects.Hour = 19;emergencyProjects.WriteProgram();emergencyProjects.Hour = 22;emergencyProjects.WriteProgram();Console.Read();}}

 class Context{private State state;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);}}

 abstract class State{public abstract void Handle(Context context);}class ConcreteStateA : State{public override void Handle(Context context){context.State = new ConcreteStateB();}}class ConcreteStateB : State{public override void Handle(Context context){context.State = new ConcreteStateA();}}

  public  abstract class WorkState{public abstract void WriteProgram(Work w);}public class ForenoonState : WorkState{public override void WriteProgram(Work w){if (w.Hour<12){Console.WriteLine("Current Time:{0},WorkState is good ,refresh!",w.Hour);}else{w.SetState(new NoonState());w.WriteProgram();}}}public class NoonState : WorkState{public override void WriteProgram(Work w){if(w.Hour < 13){Console.WriteLine("Current Time:{0},Hungery,want a afternoon sleep!", w.Hour);}else{w.SetState(new AfernoonState());w.WriteProgram();}}}public class AfernoonState : WorkState{public override void WriteProgram(Work w){if(w.Hour < 17){Console.WriteLine("Current Time:{0},Feeling good ,keep work!", w.Hour);}else{w.SetState(new EveningState());w.WriteProgram();}}}public class EveningState : WorkState{public override void WriteProgram(Work w){if(w.TaskFinished){w.SetState(new RestState());w.WriteProgram();}else{if(w.Hour < 21){Console.WriteLine("Current Time:{0},Keep working but Feeling very tired!", w.Hour);}else{w.SetState(new SleepState());w.WriteProgram();}}}}public class RestState : WorkState{public override void WriteProgram(Work w){Console.WriteLine("Current Time:{0},Go home!", w.Hour);}}public class SleepState : WorkState{public override void WriteProgram(Work w){Console.WriteLine("Current Time:{0},Can't keep work and fall in sleep!", w.Hour);}}

 public class Work{    public Work(){current = new ForenoonState();}private int hour;public int Hour{get { return hour; }set { hour = value; }}private bool finish = false;public bool TaskFinished{get { return finish; }set { finish = value; }}private WorkState current;public void SetState(WorkState workState){current = workState;}public void WriteProgram(){current.WriteProgram(this);}}

转载请注明出处!!!

欢迎加入951815219群聊,共享知识,讨论交流~

设计模式二十四讲之《状态模式》相关推荐

  1. 云计算设计模式(二十四)——仆人键模式

    云计算设计模式(二十四)--仆人键模式 使用一个令牌或密钥,向客户提供受限制的直接訪问特定的资源或服务,以便由应用程序代码卸载数据传输操作. 这个模式是在使用云托管的存储系统或队列的应用中特别实用,而 ...

  2. 【二十四讲】ControllerAdvice 之 @InitBinder

    [二十四讲]ControllerAdvice 之 @InitBinder 绑定器工厂的扩展点:@InitBinder 及来源 编程技巧:缓存加速 文章目录 [二十四讲]ControllerAdvice ...

  3. 【每天一个java设计模式(十四)】 - 解释器模式

    解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文. 解释器模式主要包括以下几个部分: 抽象表达式角色:定义解释器的接口,约定解释 ...

  4. 设计模式学习笔记(二十四):策略模式

    1 概述 1.1 引言 在外出旅游时,很多时候的出行方式都不止一条,通常根据实际情况,比如目的地,预算,旅游时间等确定最适合的出行方式.在软件开发中,也常常会遇到类似的情况,实现某一个功能有多种途径, ...

  5. 设计模式(十四)中介者模式

    相关文章 设计模式(一)设计六大原则 设计模式(二)单例模式的七种写法 设计模式(三)建造者模式 设计模式(四)简单工厂模式 设计模式(五)观察者模式 设计模式(六)代理模式 设计模式(七)装饰模式 ...

  6. python设计模式(十四):模板方法模式

    定义一个算法或者流程,部分环节设计为外部可变,用类似于模板的思想来实例化一个实体,可以往模板中填充不同的内容:在模板思想下,实体的整体框架是确定的,他是一个模板,但是模板下内容可变,从而实现了动态的更 ...

  7. 二十四、数据挖掘时序模式

    时序模式 1. 时序模式 1.1 问题引入 下个月的商品销量.销售额或库存量是多少? 明天广州市的最高用电负荷是多少? 序列模式的概念 时序模式:描述基于时间或其他序列的经常发生的规律或趋势,并对其建 ...

  8. 设计模式笔记十四:责任链模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 责任链模式 顾名思义,责任链模式(Chain of Responsibi ...

  9. 大聪明教你学Java设计模式 | 第十四篇:迭代器模式

    前言

  10. 【白话设计模式二十二】解释器模式(Interpreter)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

最新文章

  1. 一万年太久,只争朝夕
  2. linux上传github项目
  3. centos后台登录ftp_「vscode remote ssh 免登录」mac
  4. DOM-9 【实战】模块化开发Todolist(面向过程)
  5. 菜鸟+Hologres=智能物流
  6. BOOT.INI文件的目的[微软提供]
  7. sql运算符_SQL AND运算符解释语法示例
  8. 【BZOJ1999】树网的核,求树的直径+单调队列乱搞
  9. Deep learning with python notebooks 笔记 第一章 深度学习基础
  10. OpenCV统计应用-CvHistogram直方图资料
  11. kernel——make menuconfig的实现原理【转】
  12. leapmotion 初识
  13. android tcp 工具,TcpIp工具包app
  14. 基于ResNet深度时空残差网络的城市交通流预测
  15. Unity 游戏实例开发集合 之 FlappyBird (像素鸟) 休闲小游戏快速实现
  16. 用python实现数度游戏
  17. excel实现join功能
  18. 聚焦新零售 阿里云重磅推出零售云 1
  19. 佛教禅理——对待命运
  20. China Merchants Bank Beats Rivals In Quality Of Service

热门文章

  1. unknown source怎么解决?unknown source是什么意思【详解】
  2. [计算机数值分析]牛顿插值公式
  3. 值得收藏的网站----安全
  4. 第六周作业-需求建模
  5. java超类_Java——超类和子类对象之间的转换
  6. 怎样去掉gif动图水印?在线编辑gif图片技巧
  7. php的fopen函数打开文件详解以及如何打开中文名文件
  8. arctanx麦克劳林公式推导过程_高中数学三角函数公式大全,竞赛高考都适用(含公式推导)...
  9. golang 结构体数组的初始化赋值
  10. Android 深色模式使用失效