状态模式介绍:

当一个对象在内在状态改变时,允许改变起行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

简例
工作状态-分类板

package com.example.designmode.statepattern;import lombok.Data;/*** <h3>design-mode</h3>* <p>工作状态-分类板</p>** @author : ZhangYuJie* @date : 2022-04-24 14:56**/
@Data
public class Work {private int hour;private Boolean finish=false;public void writeProgram() {if (hour < 12) {System.err.println("当前时间:上午" + hour + "点");} else if (hour < 13) {System.err.println("当前时间:中午" + hour + "点");} else if (hour < 17) {System.err.println("当前时间:下午" + hour + "点");} else {if (finish) {System.err.println("当前时间:下班回家" + hour + "点");} else {if (hour < 21) {System.err.println("当前时间:加班哦,疲累之极" + hour + "点");} else {System.err.println("当前时间:不行了,睡着了" + hour + "点");}}}}
}

客户端程序:

public static void main(String[] args) {Work emergencyProjects = new Work();emergencyProjects.hour = 9;emergencyProjects.writeProgram();emergencyProjects.hour = 10;emergencyProjects.writeProgram();emergencyProjects.hour = 12;emergencyProjects.writeProgram();emergencyProjects.hour = 13;emergencyProjects.writeProgram();emergencyProjects.hour = 14;emergencyProjects.writeProgram();emergencyProjects.hour = 17;emergencyProjects.writeProgram();//emergencyProjects.WorkFinished = true;emergencyProjects.finish = false;emergencyProjects.writeProgram();emergencyProjects.hour = 19;emergencyProjects.writeProgram();emergencyProjects.hour = 22;emergencyProjects.writeProgram();}

以上代码有个很大的问题:
‘Work’类的’writeProgram’方法很长,而且有很多判断的分支,这也就意味着它的责任过大了。无论是任何状态,都需要通过它来改变,这实际上是很糟糕的。
面对对象设计其实就是希望做到代码的责任分解这个类违背了’单一职责原则’。而且由于’WriteProgram’的方法里面有这么多判断,使得任何需求的改动或增加,都需要更改这个方法。又违背了’开放-封闭原则’。这类有个解决方案,就是’状态模式’。

状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于摸个ConcreteState中,所以通过定义新的字类可以很容易地增加新的状态与转换。这样做的目的就是为了消除庞大的条件分支语句。状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以使用状态模式了。

工作状态-状态模式板

package com.example.designmode.statepattern;/*** <h3>design-mode</h3>* <p>抽象状态</p>** @author : ZhangYuJie* @date : 2022-04-24 15:14**/public abstract  class State {public abstract void writeProgram(Work w);
}

上午工作状态

package com.example.designmode.statepattern;/*** <h3>design-mode</h3>* <p>上午工作状态</p>** @author : ZhangYuJie* @date : 2022-04-24 15:14**/public class ForenoonState extends State {@Overridepublic void writeProgram(Work w) {if (w.getHour() < 12){System.err.println("当前时间:上午"+w.getHour()+"点");} else{w.setState(new NoonState());w.writeProgram();}}
}

中午工作状态

package com.example.designmode.statepattern;/*** <h3>design-mode</h3>* <p>中午工作状态</p>** @author : ZhangYuJie* @date : 2022-04-24 15:17**/public class NoonState extends State {@Overridepublic void writeProgram(Work w) {if (w.getHour() < 13){System.err.println("当前时间: 下午"+w.getHour()+"点");} else{w.setState(new EveningState());w.writeProgram();}}
}

下午工作状态

package com.example.designmode.statepattern;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-04-24 15:36**/public class AfterNoonState extends State {@Overridepublic void writeProgram(Work w) {if (w.getHour() < 13) {System.err.println("当前时间:下午" + w.getHour() + "点");} else {w.setState(new EveningState());w.writeProgram();}}
}

晚间工作状态

package com.example.designmode.statepattern;/*** <h3>design-mode</h3>* <p>晚间工作状态</p>** @author : ZhangYuJie* @date : 2022-04-24 15:18**/public class EveningState extends State {@Overridepublic void writeProgram(Work w) {if (w.getFinish()){w.setState(new RestState());w.writeProgram();} else{if (w.getHour() < 21){System.err.println("当前时间:加班哦,疲累"+w.getHour()+"点");} else{w.setState(new SleepingState());w.writeProgram();}}}
}

睡眠状态

package com.example.designmode.statepattern;/*** <h3>design-mode</h3>* <p>睡眠状态</p>** @author : ZhangYuJie* @date : 2022-04-24 15:20**/public class SleepingState extends State {@Overridepublic void writeProgram(Work w) {if (w.getHour() < 13) {System.err.println("当前时间: 不行了,睡着了。" + w.getHour() + "点");}}
}

下班休息状态

package com.example.designmode.statepattern;/*** <h3>design-mode</h3>* <p>下班休息状态</p>** @author : ZhangYuJie* @date : 2022-04-24 15:21**/public class RestState extends State {@Overridepublic void writeProgram(Work w) {System.err.println("当前时间: 下班回家了。"+w.getHour()+"点");}
}

工作类改造

package com.example.designmode.statepattern;import lombok.Data;/*** <h3>design-mode</h3>* <p>工作状态-改造版</p>** @author : ZhangYuJie* @date : 2022-04-24 14:56**/
@Data
public class Work {private int hour;private Boolean finish = false;private State state;public Work() {state = new ForenoonState();}public void writeProgram() {this.state.writeProgram(this);}}

客户端代码,没有任何改动。但我们的程序却更加灵活易变了。

public static void main(String[] args) {Work emergencyProjects = new Work();emergencyProjects.hour = 9;emergencyProjects.writeProgram();emergencyProjects.hour = 10;emergencyProjects.writeProgram();emergencyProjects.hour = 12;emergencyProjects.writeProgram();emergencyProjects.hour = 13;emergencyProjects.writeProgram();emergencyProjects.hour = 14;emergencyProjects.writeProgram();emergencyProjects.hour = 17;emergencyProjects.writeProgram();//emergencyProjects.WorkFinished = true;emergencyProjects.finish = true;emergencyProjects.writeProgram();emergencyProjects.hour = 19;emergencyProjects.writeProgram();emergencyProjects.hour = 22;emergencyProjects.writeProgram();}

状态模式总结

状态模式的主要优点在于封装了转换规则,并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数;其缺点在于使用状态模式会增加系统类和对象的个数,且状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱,对于可以切换状态的状态模式不满足“开闭原则”的要求

java设计模式-状态模式相关推荐

  1. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  2. Java设计模式——状态模式【State Pattern】

    一.引言 23种设计模式大概分为三大类: 5种(创建型模式):工厂方法模式.抽象工厂模式.单例模式.原型模式.建造者模式. 7种(结构型模式):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

  3. java设计模式---状态模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述状态(State)模式的: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为 ...

  4. JAVA 设计模式 : 状态模式

    原文出处: 屌丝码农 一.引出状态模式 假设我们现在有一个糖果机项目,那么我们知道正常一般糖果机提供给用户的行为有这么几种:投入硬币.转动曲柄.退出硬币几种行为:那么糖果机呢一般有这几中状态,待机状态 ...

  5. Java设计模式—状态模式

    (尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/52468077冷血之心的博客) 目录 定义如下: 个人理解: 通用 ...

  6. Java设计模式-状态模式(State)

    核心思想就是:当对象的状态改变时,同时改变其行为,很好理解!就拿QQ来说,有几种状态,在线.隐身.忙碌等,每个状态对应不同的操作,而且你的好友也能看到你的状态,所以,状态模式就两点:1.可以通过改变状 ...

  7. 深入理解Java设计模式——状态模式

    目录 一.什么是状态模式 二.状态模式应用场景 三.状态模式实现 1. 需要重构的代码 四.状态模式与策略模式区别 五.状态模式实现 一.什么是状态模式 状态模式允许一个对象在其内部状态改变的时候改变 ...

  8. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  9. Java 有限状态机 (设计模式——状态模式)

    Java 有限状态机 (设计模式--状态模式) 编写代码的时候,有时会遇见较为复杂的swith...case...和if...else...语句.这一刻有时会想到状态机,用有限状态机替换swith.. ...

最新文章

  1. DDD+中台+微服务,yyds
  2. 公平锁与非公平锁源码对比
  3. 推动IT转型的三大法宝
  4. Cesium中的坐标系及转换
  5. 微课|玩转Python轻松过二级(3.3节):字典使用要点
  6. log添加 oracle redo_添加Redo log Member/Group-Oracle
  7. 基于Windows Server 2008 R2的Failover Cluster(故障转移群集)部署Sql Server 2008 AA(主主) 模式群集(第一部分)
  8. R查看和更改工作路径的命令
  9. 元界Metaverse清单:你需要知道的一切
  10. Redis 深度历险: 核心原理和应用实践
  11. 【Ubuntu 20.04 安装中文输入法 谷歌拼音】
  12. 如何打造3D立体世界?跟随图片一同探寻
  13. cordova 创建app项目,签名打包部署
  14. liunx在线安装mysql/修改mysql密码/设置简单mysql密码
  15. [机器学习]Logistic回归
  16. 2022年最受欢迎的十大狗狗品种排行榜:拉布拉多猎犬第一 | 美通社头条
  17. 你好啊 未来的自己
  18. LuaHelper高性能Lua插件
  19. 谷歌浏览器table不规则表格使用rowspan/colspan导致线条粗细不同
  20. 洋桃技术支持0006:开发板上电扬声器有杂音怎么办?

热门文章

  1. matlab2020b linux,Ubuntu18.04安装MATLAB2020b
  2. iOS 遍历字符串得到每一个字
  3. 约瑟夫问题的java简单算法
  4. 微型计算机奔三奔四指的是,今年最火“山楂裙”,征服了太多奔三奔四的女人,自信大方又优雅...
  5. 张云雷看过的电影-生化危机诅咒
  6. 网络空间安全面试题目及答案(简版)
  7. 不能做switch()的参数类型
  8. 小白使用centos7图形化界面后搭建“巡风安全扫描系统”
  9. 面向对象和面向过程(总结版)
  10. 2021年全球溶剂石脑油收入大约9212.2百万美元,预计2028年达到12140百万美元