在阎宏博士的《JAVA与模式》一书中开头是这样描述状态(State)模式的:

  状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。

  状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。


状态模式的结构

  用一句话来表述,状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式的示意性类图如下所示:

  状态模式所涉及到的角色有:

  ●  环境(Context)角色,也成上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。

  ●  抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。

  ●  具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。

  源代码

  环境角色类

public class Context {//持有一个State类型的对象实例private State state;public void setState(State state) {this.state = state;}/*** 用户感兴趣的接口方法*/public void request(String sampleParameter) {//转调state来处理state.handle(sampleParameter);}
}

 抽象状态类

public interface State {/*** 状态对应的处理*/public void handle(String sampleParameter);
}

具体状态类

public class ConcreteStateA implements State {@Overridepublic void handle(String sampleParameter) {System.out.println("ConcreteStateA handle :" + sampleParameter);}}
public class ConcreteStateB implements State {@Overridepublic void handle(String sampleParameter) {System.out.println("ConcreteStateB handle :" + sampleParameter);}}

 客户端类

public class Client {public static void main(String[] args){//创建状态State state = new ConcreteStateB();//创建环境Context context = new Context();//将状态设置到环境中context.setState(state);//请求context.request("test");}
}

 从上面可以看出,环境类Context的行为request()是委派给某一个具体状态类的。通过使用多态性原则,可以动态改变环境类Context的属性State的内容,使其从指向一个具体状态类变换到指向另一个具体状态类,从而使环境类的行为request()由不同的具体状态类来执行。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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. 1108轮播图和定时器this问题
  2. xampp php连接mysql数据库_关于PHP xampp连接数据库之后查询失败,数据库连接成功,表中也有数据...
  3. IUnknown接口QueryInterface函数介绍
  4. docker ssh
  5. FireEye动态:SolarWinds Orion 新 0day用于安装SUPERNOVA
  6. Find Any File for Mac(本地文件搜索查找工具)
  7. UML中对关系的描述
  8. 电影票APP原型设计分享– Movie Booking
  9. 二维码生成及批量生成并打包
  10. 松翰单片机数码管c语言,松翰单片机数码管程序
  11. 电影社交网络中Facemash女生评比算法讲解
  12. LTP(Linux Test Project)使用指南
  13. python发送各类QQ邮件 —— smtplib与email模块
  14. 苹果6s照相快门声音设置_手机隐藏的10种快门启动方式,你都知道吗?
  15. python如何爬取网站所有目录_python 爬取网站的博客目录
  16. 乐字节炫酷HTML 与 CSS
  17. EETI eGTouch Linux 驱动的安装与使用
  18. Mac Pro 8g java 开发_2017款MacBook Pro开发java,8g内存够用吗?
  19. SEO关键词排名优化教程
  20. Python之Datasets库安装报错的解决方法

热门文章

  1. 转载/JSTL/attribute value does not accept any express
  2. JavaScript 事件——“事件类型”中“复合事件”和“变动事件”的注意要点
  3. 细说JavaScript异步函数发展历程
  4. [编解码] 关于base64编码的原理及实现
  5. 网络安全系列之二十一 配置IPSEC安全策略
  6. Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道
  7. Android线程模型和AsyncTask
  8. [转]Erlang 大量写入出警报
  9. 云计算究竟能帮你具体做些什么事?
  10. 盘点几个值得你借鉴的Java学习方法