博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(16)-----状态模式
阅读量:5098 次
发布时间:2019-06-13

本文共 2753 字,大约阅读时间需要 9 分钟。

状态模式(State)

定义

  当一个对象的内在状态改变时允许改变其行为,这个帝乡看起来像是改变了其类。

UML类图

  

例子

  State

package com.csdhsm.pattemdesign.state;/**   * @Title:  State.java    * @Description: 状态接口 * @author: Han    * @date:   2016年6月24日 下午9:47:24   */  public interface State {        public void handler(StateMachine state);}

  Context

package com.csdhsm.pattemdesign.state;/**   * @Title:  StateMachine.java    * @Description: 环境(Context)角色:给出此时的状态  * @author: Han    * @date:   2016年6月24日 下午9:49:35   */  public class StateMachine {        //当前的状态    private State currentState;    public State getCurrentState() {        return currentState;    }    public void setCurrentState(State currentState) {        this.currentState = currentState;    }}

  开始状态

package com.csdhsm.pattemdesign.state;/**   * @Title:  StartState.java    * @Description: 开始状态 * @author: Han    * @date:   2016年6月24日 下午9:47:39   */  public class StartState implements State {    @Override    public void handler(StateMachine state) {                System.out.println("start to process...");        //进入制作状态        state.setCurrentState(new MakeState());    }}

  制作状态

package com.csdhsm.pattemdesign.state;/**   * @Title:  MakeState.java    * @Description: 制作状态 * @author: Han    * @date:   2016年6月24日 下午9:48:56   */  public class MakeState implements State {    @Override    public void handler(StateMachine state) {                System.out.println("Makeing...");        //进入完成状态        state.setCurrentState(new CompletedState());    }}

  完成状态

package com.csdhsm.pattemdesign.state;/**   * @Title:  CompletedState.java    * @Description: 完成状态 * @author: Han    * @date:   2016年6月24日 下午9:49:06   */  public class CompletedState implements State {    @Override    public void handler(StateMachine state) {                System.out.println("complete...");        state.setCurrentState(null);    }}

  客户端

package com.csdhsm.pattemdesign.state;public class Solution {        public static void main(String[] args) {                StateMachine machine = new StateMachine();        State start = new StartState();        machine.setCurrentState(start);                //一直更改状态,直到完成        while(machine.getCurrentState() != null) {            machine.getCurrentState().handler(machine);        }    }}

  结果

  ok,成功!

总结

  在状态模式中,环境(Context)是持有状态的对象,但是环境(Context)自身并不处理跟状态相关的行为,而是把处理状态的功能委托给了状态对应的状态处理类来处理。

  在具体的状态处理类中经常需要获取环境(Context)自身的数据,甚至在必要的时候会回调环境(Context)的方法,因此,通常将环境(Context)自身当作一个参数传递给具体的状态处理类。

  客户端一般只和环境(Context)交互。客户端可以用状态对象来配置一个环境(Context),一旦配置完毕,就不再需要和状态对象打交道了。客户端通常不负责运行期间状态的维护,也不负责决定后续到底使用哪一个具体的状态处理对象。

  引用资料:http://www.cnblogs.com/BenWong/archive/2012/12/12/2813982.html    http://www.cnblogs.com/java-my-life/archive/2012/06/08/2538146.html

转载于:https://www.cnblogs.com/a294098789/p/5615425.html

你可能感兴趣的文章
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
IOS-图片操作集合
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
jquery实现限制textarea输入字数
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
ActiveMQ与spring整合
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
格式化输出数字和时间
查看>>
关于TFS2010使用常见问题
查看>>
URL编码与解码
查看>>
Eclipse 安装SVN插件
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>
js 过滤敏感词
查看>>
poj2752 Seek the Name, Seek the Fame
查看>>
软件开发和软件测试,我该如何选择?(蜗牛学院)
查看>>
基本封装方法
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>