2019独角兽企业重金招聘Python工程师标准>>>

问题引入:

糖果机有四个状态,在不同的动作下状态会发生转变。后续可能会添加其他状态,例如转动曲柄,有可能调出两颗弹。

设计方案:

1、定义一个State接口,在这个接口内,糖果机的每个工作都有一个对应的方法。

2、然后为机器中的每个状态实现状态类。这些类将负责在对应的状态下进行机器的行为。

GumballMachine:

GumballMachine有一个State变量记录当前糖果机的状态,糖果机的所有行为都是委托到了当前糖果机状态对应的行为方法去执行。

源码地址:https://github.com/silence1133/DesignMode/tree/master/src/main/java/cn/zxy/state

状态模式的定义:

状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

将状态封装成为独立的类,并将动作委托到当前状态的对象。

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

状态模式的结构:

源代码:

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);}
}

State: 

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

ConcreteStateA:

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

 ConcreteStateB:

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()由不同的具体状态类来执行。

转载于:https://my.oschina.net/silence88/blog/1071849

HeadFirst设计模式篇十:状态模式相关推荐

  1. 设计模式篇:状态模式(一)

    当我们用Unity进行场景切换时,可能会写下如下代码: using UnityEngine; using UnityEngine.SceneManagement;public class Revers ...

  2. 设计模式篇:状态模式(二)

    完整工程:https://gitee.com/NKG/DesignPatterns/blob/master/DesignPatterns.unitypackage 首先在Unity下面创建如下文件 首 ...

  3. 【游戏设计模式】之三 状态模式、有限状态机

    转载自:https://blog.csdn.net/poem_qianmo/article/details/52824776 游戏开发过程中,各种游戏状态的切换无处不在.但很多时候,简单粗暴的if e ...

  4. 【游戏设计模式】之三 状态模式、有限状态机 Unity版本实现

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/52824776 作者:毛星云(浅 ...

  5. 【游戏设计模式】之三 状态模式 有限状态机 Unity版本实现

     本系列文章由@浅墨_毛星云 出品,转载请注明出处.    文章链接: http://blog.csdn.net/poem_qianmo/article/details/52824776  作者:毛星 ...

  6. 设计模式之略见一斑(状态模式State)

    设计模式中的状态模式相对比较简单,简单的说就是对某个对象的状态进行管理.对象的状态如果的多的话,假如没有对其进行管理,极易造成管理混乱.从而使系统难以维护,所以State模式的意图就是将与状态有关的处 ...

  7. 设计模式学习笔记-状态模式

    引言 使用该设计模式的情况:如在场景中的主角甚至是敌人,有N个不同状态:走路,攻击,待机.....,游戏中,这些状态来回切换.有一个明确的状态划分的情况下,此时,是可以使用Switch...case. ...

  8. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]...

    一.一个叫声接口和几只鸭子 从一个叫声接口开始. {<HeadFirst设计模式>Delphi代码之模式小结 } { 一个叫声接口                            } ...

  9. 设计模式C++实现 ——状态模式

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

最新文章

  1. (002)RN开发之第一个项目以及真机运行
  2. jenkins Email-EXT plugins
  3. Android艺术——性能优化问题
  4. [CODEVS 1050] 棋盘染色 2
  5. 04-Fibonacci
  6. 2017.10.6 Java命名规范及使用情况
  7. 1006.c++中结构体赋值碰到的bug
  8. 如何通过文件流将很多图片存入SD卡,而不是自己内存
  9. 在浏览器中输入url地址 - 显示主页的过程
  10. IPQ4019MTD分区生成的过程
  11. 关于“父虚拟磁盘在子虚拟磁盘创建之后被修改过。……打不开磁盘啥啥啥”的解决方法
  12. 招商银行信用卡中心2018秋招部分编程题汇总
  13. mysql求月平均_mysql求平均值
  14. 亚马逊、Lazada、shopee、ebay、wish、tiktok、速卖通、乐天、煤炉、独立站、美客多、沃尔玛、阿里国际测评(补单)怎么盈利?怎么做?
  15. 使用百度地图api 报错 A parser-blocking, cross site
  16. 小虎电商浏览器:拼多多层级有什么作用?多多参谋客服为你解答
  17. Python格式化JSON文件
  18. Set 集合以及Set集合的一些常用方法
  19. jz2440---使用uboot烧录程序
  20. 计算机基础及Java语法

热门文章

  1. mySQL优化 my.ini 配置说明
  2. sql安装错误解决办法
  3. 模态框到阻止冒泡时间
  4. 【Java实现】栈和队列就是这么简单
  5. 磁盘占用百分百?Windows 10必做各项优化
  6. GPT分区无损转MBR分区的操作
  7. squid服务器的代理
  8. 读书笔记:《HTML5开发手册》--figure、time、details、mark
  9. 浅析主键自增长的优缺点
  10. Maven入门(一)(HelloMaven)