状态模式

允许一个对象在其内部状态发生改变时改变其行为能力。

我刚开始看到这个模式的时候,没啥感觉,不知道这东西要说的是个啥,后来看了个案例,渐渐清楚了,这个模式本身还是比较简单的。

小菜的工作状态

这个案例出自程杰的《大话设计模式》,抽取案例模型,完整案例还请大家自行阅读

案例说的是主人公“小菜”上班写代码时的各种状态,上午的时候精神饱满,中午时有点萎靡,下午状态一般,晚上状态疲惫。然后这一天各个时段的写代码状态用程序表达出来是这个样子的;

public class Work {static int clock;public static void main(String[] args) {// 上午 9 点clock = 9;writeCode();// 中午 12 点clock = 12;writeCode();// 下午 15 点clock = 15;writeCode();// 晚上 21 点clock = 21;writeCode();}public static void writeCode() {if (clock < 12) {System.out.println("精神抖擞写代码");} else if (clock < 13) {System.out.println("饿了困了写代码");} else if (clock < 17) {System.out.println("状态一般写代码");} else if (clock < 23) {System.out.println("加班疲惫写代码");}}
}

一段典型的面向过程编程代码,之后根据面向对象的思想来改了一版变成了这样。

public class OOPWork {public static void main(String[] args) {Working working = new Working();// 上午 9 点working.clock = 9;working.writeCode();// 中午 12 点working.clock = 12;working.writeCode();// 下午 15 点working.clock = 15;working.writeCode();// 晚上 21 点working.clock = 21;working.writeCode();}
}class Working {int clock;public void writeCode() {if (clock < 12) {new MorningState();} else if (clock < 13) {new NoonState();} else if (clock < 17) {new AfterNoonState();} else if (clock < 23) {new EveningState();}}
}class MorningState {{System.out.println("精神抖擞写代码");}
}class NoonState {{System.out.println("饿了困了写代码");}
}class AfterNoonState {{System.out.println("状态一般写代码");}
}class EveningState {{System.out.println("加班疲惫写代码");}
}

其实写到这里我相信大家就算没看过这本书也能多少发现一点端倪,就是这个 Working 类是不是有点奇怪。每新增一个状态就要去改这个类,而且这里负责了全部的工作状态,还有最关键的就是这个 if else 是不是有点太长了???没错,其实这些都可以用 状态模式 来规避掉,并且这些在软件设计中也都违反了一些原则或建议。

  1. 每新增一个状态就要去改这个类(违反了 开闭原则
  2. 而且这里负责了全部的工作状态(违反了 单一职责原则
  3. 还有最关键的就是这个 if else 是不是有点太长了???(这是 重构 书中提到的 long method 的坏味道)

利用状态模式解决这 3 个问题

首先来看下状态模式的结构类图

状态模式类图

状态模式:从工作状态,再到订单状态一点点深入学习状态模式相关推荐

  1. LVS负载均衡(3)——LVS工作模式与工作原理

    LVS介绍及工作原理 1. LVS 介绍 LVS,Linux Virtual Server 的简写,意即 Linux 虚拟服务器,是一个虚拟的服务器集群系统,可以在 UNIX/Linux 平台下实现负 ...

  2. ARM体系结构(1)- 工作模式与工作状态

    1. ARM的工作模式 用户模式(usr):属于正常的用户模式,ARM处理器正常的程序执行状态. 快速中断模式(fiq):用于处理快速中断,对高速数据传输或通道处理. 外部中断模式(irq):对一般情 ...

  3. 发运确认后,订单行保持“已挑库”状态 Order Line Remains in Picked (Awaiting Shipping) Status After Ship Confirmation

    发运确认后,订单行保持"已挑库"状态 Order Line Remains in Picked (Awaiting Shipping) Status After Ship Conf ...

  4. Vuex 状态管理的工作原理

    Vuex 状态管理的工作原理 为什么要使用 Vuex 当我们使用 Vue.js 来开发一个单页应用时,经常会遇到一些组件间共享的数据或状态,或是需要通过 props 深层传递的一些数据.在应用规模较小 ...

  5. 车辆ACC控制,在未检测到前车的情况下自车处于定速巡航状态,当有前车切入时,则切换为自适应巡航模式

    车辆ACC控制,在未检测到前车的情况下自车处于定速巡航状态,当有前车切入时,则切换为自适应巡航模式,采用mpc控制算法,在保证较小加速度保证舒适型性的同时尽快较小车间距误差和速度误差. 采用的是car ...

  6. 线程的几种状态_拜托:不要再问我线程有多少种状态了

    废话不多说,有六种状态 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中, 有几种状态呢?在Thread类中包含了个State枚举类,State枚举类 ...

  7. 万字总结,体系化带你全面认识 Kube-Proxy IPVS 模式的工作原理

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 作者:Dustin Specker 译者:米开朗基杨 译者简介:KubeSphere 布道师,目前就职于青云科技 ...

  8. 一个五年程序员的学习状态

    分享我的书架:一个五年程序员的学习状态.收集的图书以及我的学习观 如何被推荐? 去年写了一篇文章<一个工作3~4年程序员的年度学习计划>,里面列出了一些计划阅读的书目.一年过去了,进度很一 ...

  9. 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

最新文章

  1. python3 队列 queue
  2. SpringBoot的Thymeleaf支持,结合SpringMVC做的案例(学习SpringBoot实战)
  3. Vue-Cleave - 在Vue中使用CleaveJS格式化你的输入内容
  4. 服务器性能指标(一)——负载(Load)分析及问题排查
  5. C#中的CultureInfo类
  6. Python学习9 面向对象 类和对象
  7. oracle blob查重,如何解决oracle blob字段 的乱码问题
  8. 全网最详细的Windows里下载与安装Sublime Text *(图文详解)
  9. IDEA上传项目到SVN
  10. UE4实时渲染——渲染前和遮挡
  11. 高分子物理考研概念及要点、考点总结
  12. 我的挣扎 与 TBtools 的开发
  13. 微信小程序重新发起请求加载页面
  14. Raspberry Pi3驱动Oled ssh1106屏
  15. 【C++学习笔记】基本内置类型和变量
  16. 树莓派Zero 2W python3.7 安装tensorflow2.2
  17. 什么是微信商城?如何微商城?
  18. Java课程设计项目 客户信息管理软件 客户信息管理系统的实现
  19. confirm点确认跳转,点取消关闭
  20. 2021年江苏一级计算机报名时间,江苏2021年3月计算机一级报名时间安排

热门文章

  1. cached in the local repository的解决办法
  2. 秒杀系统的技术挑战、应对策略以及架构设计总结一二!
  3. [Python3] Matplotlib.pyplot.plot图形符号、风格及颜色缩写速查表
  4. 派森小镇(六)熊孩子
  5. Docker容器实现跨主机间通讯
  6. 5-p05_prisoners
  7. 深入理解字符串的不可变性[java]
  8. 手把手教你完成一个数据科学小项目(7):经纬度获取与BDP可视化
  9. 【学习笔记】【DBN】十九——深度信念网络DBN
  10. 最近我MRI重建的一些进度