该项目源码地址:https://github.com/ggb2312/JavaNotes/tree/master/design-pattern(设计模式相关代码与笔记)

1. 定义

允许一个对象在其内部状态改变时,改变它的行为

2. 适用场景

一个对象存在多个状态(不同状态下行为不同),且状态可相互转换
比如:电商订单状态扭转等

3. 类图与角色

Context:它就是那个含有状态的对象,它可以处理一些请求,这些请求最终产生的响应会与状态相关。

State:状态接口,它定义了每一个状态的行为集合,这些行为会在Context中得以使用。

ConcreteState:具体状态,实现相关行为的具体状态类。

4. 相关设计模式

状态模式和享元模式
状态模式和享元模式可以组合使用

5. 模式实例

背景:视频的播放状态切换

(1)视频状态抽象类

/*** Create by lastwhisper on 2019/2/11*/
public abstract class CourseVideoState {protected CourseVideoContext courseVideoContext;public void setCourseVideoContext(CourseVideoContext courseVideoContext) {this.courseVideoContext = courseVideoContext;}public abstract void play();public abstract void speed();public abstract void pause();public abstract void stop();
}

(2)视频上下文

/*** Create by lastwhisper on 2019/2/11*/
public class CourseVideoContext {private CourseVideoState courseVideoState;public final static PlayState PLAY_STATE = new PlayState();public final static StopState STOP_STATE = new StopState();public final static PauseState PAUSE_STATE = new PauseState();public final static SpeedState SPEED_STATE = new SpeedState();public CourseVideoState getCourseVideoState() {return courseVideoState;}public void setCourseVideoState(CourseVideoState courseVideoState) {this.courseVideoState = courseVideoState;this.courseVideoState.setCourseVideoContext(this);}public void play() {this.courseVideoState.play();}public void speed() {this.courseVideoState.speed();}public void pause() {this.courseVideoState.pause();}public void stop() {this.courseVideoState.stop();}
}

(3)视频的各种具体状态类

PlayState 正常播放课程视频状态

/*** Create by lastwhisper on 2019/2/11*/
public class PlayState extends CourseVideoState {@Overridepublic void play() {System.out.println("正常播放课程视频状态");}@Overridepublic void speed() {super.courseVideoContext.setCourseVideoState(CourseVideoContext.SPEED_STATE);}@Overridepublic void pause() {super.courseVideoContext.setCourseVideoState(CourseVideoContext.PAUSE_STATE);}@Overridepublic void stop() {super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);}
}

SpeedState 快进播放课程视频状态

/*** Create by lastwhisper on 2019/2/11*/
public class SpeedState extends CourseVideoState  {@Overridepublic void play() {super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);}@Overridepublic void speed() {System.out.println("快进播放课程视频状态");}@Overridepublic void pause() {super.courseVideoContext.setCourseVideoState(CourseVideoContext.PAUSE_STATE);}@Overridepublic void stop() {super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);}
}

PauseState 暂停播放课程视频状态

/*** Create by lastwhisper on 2019/2/11*/
public class PauseState extends CourseVideoState  {@Overridepublic void play() {super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);}@Overridepublic void speed() {super.courseVideoContext.setCourseVideoState(CourseVideoContext.SPEED_STATE);}@Overridepublic void pause() {System.out.println("暂停播放课程视频状态");}@Overridepublic void stop() {super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);}
}

StopState 停止播放课程视频状态

/*** Create by lastwhisper on 2019/2/11*/
public class StopState extends CourseVideoState  {@Overridepublic void play() {super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);}@Overridepublic void speed() {System.out.println("ERROR 停止状态不能快进!!");}@Overridepublic void pause() {System.out.println("ERROR 停止状态不能暂停!!");}@Overridepublic void stop() {System.out.println("停止播放课程视频状态");}
}

(4)测试

/*** Create by lastwhisper on 2019/2/11*/
public class Test {public static void main(String[] args){CourseVideoContext courseVideoContext = new CourseVideoContext();courseVideoContext.setCourseVideoState(new PlayState());System.out.println("当前状态"+ courseVideoContext.getCourseVideoState().getClass().getSimpleName());courseVideoContext.pause();System.out.println("当前状态"+ courseVideoContext.getCourseVideoState().getClass().getSimpleName());courseVideoContext.speed();System.out.println("当前状态"+ courseVideoContext.getCourseVideoState().getClass().getSimpleName());courseVideoContext.stop();System.out.println("当前状态"+ courseVideoContext.getCourseVideoState().getClass().getSimpleName());courseVideoContext.speed();}
}

测试结果:

(5)类图

6. 优缺点

优点:

  • 将不同的状态隔离
  • 把各种状态的转换逻辑,分布到State的子类中,减少相互间依赖
  • 增加新的状态非常简单

缺点:

  • 状态多的业务场景导致类数目增加,系统变复杂

7. 扩展-JDK1.7源码以及框架中的状态模式

javax.faces.lifecycle.Lifecycle、javax.faces.webapp.FacesServlet

转载于:https://www.cnblogs.com/gj-blog/p/10929616.html

行为型模式——状态模式(十一)相关推荐

  1. Java设计模式之行为型:状态模式

    背景: 介绍状态模式前,我们先看这样一个实例:公司力排万难终于获得某个酒店的系统开发项目,并且最终落到了你的头上.下图是他们系统的主要工作: 当第一眼看到这个系统时你就看出这是一个状态图,每个框都代表 ...

  2. 《设计模式详解》行为型模式 - 状态模式

    状态模式 6.5 状态模式 6.5.1 反例 6.5.2 结构 6.5.3 案例实现 6.5.4 优缺点 6.5.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 行为型 ...

  3. 设计模式 — 行为型模式 — 状态模式

    目录 文章目录 目录 状态模式 应用场景 代码示例 状态模式 状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程. 优点: 封装了状态转换规则. 枚举了可能的状态,在枚举状态之前需要确 ...

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

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

  5. 设计模式中介者模式-备忘录模式-状态模式

    设计模式 中介者模式 基本介绍 中介者模式使用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式属于行为模式,使 ...

  6. 《Head First 设计模式》第十章-状态模式 状态模式

    状态模式 策略模式和状态模式是双胞胎,在出生时才分开.你已经知道,策略模式是围绕可以互换的算法来创建成功业务的,然而,状态走的是更崇高的路,它通过改变对象内部的状态来帮助对象控制自己的行为. 定义状态 ...

  7. JS模式--状态模式(状态机)

    下面的状态机选择通过Function.prototype.call方法直接把请求委托给某个字面量对象来执行. var light = function () {this.currstate = FSM ...

  8. C++设计模式之状态模式(state)(行为型)

    一 定义 状态模式:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况.把不同状态的操作分散到不同的状态对象 ...

  9. 【地铁上的设计模式】--行为型模式:状态模式

    什么是状态模式 状态模式是一种行为模式,它允许对象在其内部状态发生改变时改变其行为.在状态模式中,将状态定义为独立的对象,并将对象在不同状态下的行为委托给具有相应行为的状态对象.当对象的状态发生变化时 ...

最新文章

  1. flask uwsgi nginx 部署在 ubuntu 上
  2. 10月第1周中国.COM域名增1万个 涨幅环比缩小82%
  3. 在jmeter测试中模拟不同的带宽环境
  4. jupyter 安装目录Table of Contents
  5. 使用Maven archetype 自定义项目脚手架
  6. 文档中根元素后面的标记格式必须正确。
  7. [C++STL]仿函数用法介绍
  8. Windows 应用
  9. Linux学习:第一天,
  10. Python学习笔记之爬虫
  11. java 产生无重复的随机数,Java程序生成无重复的随机数
  12. python批量下载文件
  13. 彩色图像色彩空间原理(理论篇—6)
  14. stm32h743单片机嵌入式学习笔记8-avi视频解码
  15. Discuz的sc 和tc版本有什么区别
  16. 个人财务管理系统设计与实现
  17. python中test是什么意思_Python unittest 之一: 什么是单元测试
  18. dms虚拟服务器,iOS UPNP之DMS具体操作,让手机成为DMS服务器
  19. Bootstrap设计可响应式的移动网页
  20. java打印日志的几种方式

热门文章

  1. 有没有软件能限制cpu的使用符合_电脑使用中突然黑屏是什么原因?电脑突然黑屏但是主机还运行的解决方法...
  2. 数据库设置为php5.3,php5.3不能连接mssql数据库的解决方法,php5.3mssql_PHP教程
  3. idea findbugs使用_IDEA如何协同开发统一代码风格?编码不规范如何解决?
  4. 探探自动右滑_利用AccessibilityService实现探探自动右划
  5. react 版权问题_react兼容ie
  6. 软件开发中的需求文档由谁来编写_使用 RStudio 中的 Rmarkdown 编写演示文档
  7. python3socket非阻塞在linux里无效_Linux下socket设置为非阻塞方式和fcntl系统调用
  8. 计算机辅导资料,计算机基础辅导资料.doc
  9. win10添加环境变量后没用_python 学习之在 win10 下安装 Anaconda
  10. 周围剃光头顶留长发型_?22岁亿万富翁凯莉登杂志,顶着5斤“鸟窝头”凹造型,绝代艳后...