文章目录

  • 1. 概念
  • 2. 优点
  • 3. 缺点
  • 4. 结构与实现
    • 4.1 结构
    • 4.2 实现

1. 概念

对有状态的对象,把复杂的"判断逻辑"提取到不同的状态对象中,允许状态对象在其内部发生改变时改变其行为。
状态模式是一种对象行为型模式。

2. 优点

  1. 结构清晰,状态模式将于特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足"单一职责原则"。
  2. 将状态转换显示化,减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。
  3. 状态类职责明确,有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。

3. 缺点

  1. 状态模式的使用必然会增加系统的类与对象的个数。
  2. 状态模式的结构与实现都较为复杂,如果使用不当会道之程序结构和代码的混乱。
  3. 状态模式对开闭原则的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改哪些负责状态转换的源码,否则无法切换到新增状态,而且修改某个状态类的行为也需要修改对应类的源码。

4. 结构与实现

状态模式把受环境改变的对象行为包装在不同的状态对象里,其意图是让一个对象在其内部状态改变的时候,其行为也随之改变。

4.1 结构

主要角色:

  1. 环境类角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。
  2. 抽象状态角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。
  3. 具体状态角色:实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。

4.2 实现

//环境类
public class Context {private State state;public Context() {this.state = new Weiding();}public State getState() {return state;}public void setState(State state) {this.state = state;}public void handle() {state.handle(this);}
}
//抽象状态类
public abstract class State {public abstract void handle(Context context);
}
//具体状态 我也不知道我心情咋样
public class Weiding extends State {@Overridepublic void handle(Context context) {System.out.println("早上刚起床,我也不知道我心情咋样");double tianqi = Math.random();System.out.println(tianqi);if (tianqi > 0.7) {System.out.println("推开窗,阳光明媚,心情好");context.setState(new Kaixin());} else if (tianqi > 0.4) {System.out.println("下雨了,心情不好了");context.setState(new Shangxin());} else {System.out.println("心情无变化");}}
}
//具体状态 开心
public class Kaixin extends State {@Overridepublic void handle(Context context) {System.out.println("今天很开心");double tianqi = Math.random();System.out.println(tianqi);if (tianqi > 0.7) {System.out.println("没出门,心情不知道咋样");context.setState(new Weiding());} else if (tianqi > 0.4) {System.out.println("下雨了,心情不好了");context.setState(new Shangxin());} else {System.out.println("心情无变化");}}
}
//具体状态 伤心
public class Shangxin extends State {@Overridepublic void handle(Context context) {System.out.println("今天很伤心");double tianqi = Math.random();System.out.println(tianqi);if (tianqi > 0.7) {System.out.println("推开窗,阳光明媚,心情好");context.setState(new Kaixin());} else if (tianqi > 0.4) {System.out.println("没出门,不知道心情咋样");context.setState(new Weiding());} else {System.out.println("心情无变化");}}
}

测试

public class StateTest {@Testpublic void test1() {Context context = new Context();for (int i = 0; i < 3; i++) {context.handle();}}
}

GoF总结-18(状态模式)相关推荐

  1. GoF设计模式——状态模式(C++实现)

    文章目录 概念 UML结构图 代码实现 状态模式的使用场景 概念 状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为. 在探讨状态模式的优雅之前,先来看看以下代码场景: enum ...

  2. 设计模式之状态模式(State)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. 状态模式在领域驱动设计中的使用

    领域驱动设计是软件开发的一种方式,问题复杂的地方通过将具体实现和一个不断改进的核心业务概念的模型连接解决.这个概念是Eric Evans提出的,http://www.domaindrivendesig ...

  4. 转载】泡MM与GOF的23种模式(看着挺有意思)

    [转载]泡MM与GOF的23种模式 1.FACTORY?追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说" ...

  5. C++设计模式——状态模式

    C++设计模式--状态模式 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的.   1 2 3 4 5 6 7 8 9 10 ...

  6. 设计模式:状态模式(State Pattern)

    作者:Wang Juqiang  创建于:2012-07-16 出处:http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html 收录于 ...

  7. 状态模式(State)

    一.概念: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类.[DP] 二.作用: 状态模式的主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况. 吧状态的判断逻辑 ...

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

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

  9. 读书笔记_java设计模式深入研究 第八章 状态模式 State

    1,状态模式:事务有n个状态,且维护状态变化. 2,UML模型: -1,上下文环境Context:定义客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete   ...

  10. php 状态模式,PHP设计模式之状态模式

    状态模式从字面上其实并不是很好理解.这里的状态是什么意思呢?保存状态?那不就是备忘录模式了.其实,这里的状态是类的状态,通过改变类的某个状态,让这个类感觉像是换了一个类一样.说起来有点拗口吧,先学习概 ...

最新文章

  1. JS日期时间加减实现
  2. 【Sql server: T-Sql 技术内幕 系列】之索引篇
  3. mysql1064 at line 6,MySQL错误1064语法,但一切似乎都很好
  4. Place the Guards
  5. 在ASP.NET MVC3项目中,自定义404错误页面
  6. Taro+react开发(28)小程序怎么进行自适应
  7. 2015 年出现的十大流行 Python 库
  8. 以太网的分层架构_【新能源汽车专题】智能车时代的核心,电子架构系统深度解读,国内8股进入全球产业链(名单)...
  9. python I/O 对象
  10. c#通过反射移除所有事件
  11. 【Qt教程】2.6 - Qt5 自定义控件封装
  12. 2023跨年代码(烟花+雪花)
  13. KW-Software MULTIPROG平台通过赫优讯cifX板卡实现 集成PROFIBUS-DP主站的软PLC控制器
  14. 计算机网络——HTTP
  15. 计算机网络脆弱性评估技术研究
  16. 光场视差与深度的关系(lytro深度计算公式)
  17. 嵌入式系统概论-5-总线
  18. 时间基础概念及Linux中的时间函数
  19. 一款针对中小学研发的智慧校园系统源码,智慧学校源码,Java+智慧安防+智慧互联+智慧电子班牌+小程序源码
  20. 腾讯地图SDK距离测量小工具

热门文章

  1. EcShop二次开发学习方法和Ecshop二次开发必备基础
  2. AutoJs学习-多点取色
  3. 思科CCNP认证和华为 HCIP认证路由交换技术的分类最全总结
  4. qq连连看java版_Java实战_仿QQ连连看
  5. Linux基础(三)
  6. 思科vrrp实例_VRRP配置及多备份VRRP配置实例
  7. Message Queue
  8. U盘安装Ghost XP系统教程
  9. EasyClick 坐标拾取器
  10. 2022手机号段大全、归属运营商整理—2022.01.04更新(包含三大运营商)