8. 状态(State)

Intent

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

Class Diagram

Implementation

糖果销售机有多种状态,每种状态下销售机有不同的行为,状态可以发生转移,使得销售机的行为也发生改变。

public interface State {/*** 投入 25 分钱*/void insertQuarter();/*** 退回 25 分钱*/void ejectQuarter();/*** 转动曲柄*/void turnCrank();/*** 发放糖果*/void dispense();
}
public class HasQuarterState implements State {private GumballMachine gumballMachine;public HasQuarterState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}@Overridepublic void insertQuarter() {System.out.println("You can't insert another quarter");}@Overridepublic void ejectQuarter() {System.out.println("Quarter returned");gumballMachine.setState(gumballMachine.getNoQuarterState());}@Overridepublic void turnCrank() {System.out.println("You turned...");gumballMachine.setState(gumballMachine.getSoldState());}@Overridepublic void dispense() {System.out.println("No gumball dispensed");}
}
public class NoQuarterState implements State {GumballMachine gumballMachine;public NoQuarterState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}@Overridepublic void insertQuarter() {System.out.println("You insert a quarter");gumballMachine.setState(gumballMachine.getHasQuarterState());}@Overridepublic void ejectQuarter() {System.out.println("You haven't insert a quarter");}@Overridepublic void turnCrank() {System.out.println("You turned, but there's no quarter");}@Overridepublic void dispense() {System.out.println("You need to pay first");}
}
public class SoldOutState implements State {GumballMachine gumballMachine;public SoldOutState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}@Overridepublic void insertQuarter() {System.out.println("You can't insert a quarter, the machine is sold out");}@Overridepublic void ejectQuarter() {System.out.println("You can't eject, you haven't inserted a quarter yet");}@Overridepublic void turnCrank() {System.out.println("You turned, but there are no gumballs");}@Overridepublic void dispense() {System.out.println("No gumball dispensed");}
}
public class SoldState implements State {GumballMachine gumballMachine;public SoldState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}@Overridepublic void insertQuarter() {System.out.println("Please wait, we're already giving you a gumball");}@Overridepublic void ejectQuarter() {System.out.println("Sorry, you already turned the crank");}@Overridepublic void turnCrank() {System.out.println("Turning twice doesn't get you another gumball!");}@Overridepublic void dispense() {gumballMachine.releaseBall();if (gumballMachine.getCount() > 0) {gumballMachine.setState(gumballMachine.getNoQuarterState());} else {System.out.println("Oops, out of gumballs");gumballMachine.setState(gumballMachine.getSoldOutState());}}
}
public class GumballMachine {private State soldOutState;private State noQuarterState;private State hasQuarterState;private State soldState;private State state;private int count = 0;public GumballMachine(int numberGumballs) {count = numberGumballs;soldOutState = new SoldOutState(this);noQuarterState = new NoQuarterState(this);hasQuarterState = new HasQuarterState(this);soldState = new SoldState(this);if (numberGumballs > 0) {state = noQuarterState;} else {state = soldOutState;}}public void insertQuarter() {state.insertQuarter();}public void ejectQuarter() {state.ejectQuarter();}public void turnCrank() {state.turnCrank();state.dispense();}public void setState(State state) {this.state = state;}public void releaseBall() {System.out.println("A gumball comes rolling out the slot...");if (count != 0) {count -= 1;}}public State getSoldOutState() {return soldOutState;}public State getNoQuarterState() {return noQuarterState;}public State getHasQuarterState() {return hasQuarterState;}public State getSoldState() {return soldState;}public int getCount() {return count;}
}
public class Client {public static void main(String[] args) {GumballMachine gumballMachine = new GumballMachine(5);gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.ejectQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.ejectQuarter();gumballMachine.insertQuarter();gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.turnCrank();}
}
You insert a quarter
You turned...
A gumball comes rolling out the slot...
You insert a quarter
Quarter returned
You turned, but there's no quarter
You need to pay first
You insert a quarter
You turned...
A gumball comes rolling out the slot...
You insert a quarter
You turned...
A gumball comes rolling out the slot...
You haven't insert a quarter
You insert a quarter
You can't insert another quarter
You turned...
A gumball comes rolling out the slot...
You insert a quarter
You turned...
A gumball comes rolling out the slot...
Oops, out of gumballs
You can't insert a quarter, the machine is sold out
You turned, but there are no gumballs
No gumball dispensed

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

  1. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

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

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

  3. 设计模式状态模式uml_UML的完整形式是什么?

    设计模式状态模式uml UML:统一建模语言 (UML: Unified Modeling Language) UML is an abbreviation of Unified Modeling L ...

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

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

  5. Java 有限状态机 (设计模式——状态模式)

    Java 有限状态机 (设计模式--状态模式) 编写代码的时候,有时会遇见较为复杂的swith...case...和if...else...语句.这一刻有时会想到状态机,用有限状态机替换swith.. ...

  6. C++设计模式——状态模式(state pattern)

    一.原理讲解 别名状态对象(object for state). 1.1意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 1.2应用场景 一个对象的行为取决于它的状态,并 ...

  7. 设计模式——状态模式详解

    0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...

  8. 大话设计模式—状态模式

    在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象. 大话设 ...

  9. C++设计模式-状态模式

    目录 基本概念 代码与实例 基本概念 状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类: 状态模式的好处: 1. 将与特定状态相关的行为局部化,并且将不 ...

  10. PHP设计模式——状态模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.状态模式主要解决的是当控制一个对象状态的条件表达式过于 ...

最新文章

  1. 如果宁静是 Oracle,万茜、张雨绮、黄圣依是什么?
  2. javascript中常用的
  3. 用WMI获取远程机器操作系统的详细信息
  4. SpringBoot打包时提示:Perhaps you are running on a JRE rather than a JDK?
  5. 学习 WCF (3)--开发WCF客户程序
  6. Asp.Net Core--基于角色的授权
  7. 【渝粤教育】电大中专职业健康与安全 (3)作业 题库
  8. 快速替换图片的组合-AE-样片!
  9. Simulink之大功率晶体管(GTR)
  10. 【PHP 面试知识梳理】
  11. android aapt 用法 -- ApkReader
  12. 链表在libnet中的实现
  13. 怎样远程连接Access数据库
  14. python游戏趣味编程pdf-Python游戏趣味编程
  15. MatLAB从背景单一、物体相对简单且相互分离的图片中求其照片中物体的最小外接圆圆心、半径,并画出最小外接圆
  16. imageJ打不开mp4怎么办?
  17. java软件汉化工具_6款程序员必备的开源中文处理工具
  18. 水晶报表繁体转简体心得:之一 RPT文件篇
  19. SqlServer 对象名无效的解决方法
  20. ERP电商管理系统开发实现功能

热门文章

  1. 获取jar包中的文件,及遍历jar包中的文件
  2. C语言课间程序设计实践报告
  3. 在Python中,可以使用try-except语句来处理异常。
  4. android 手机震动1次,Android的手机震动
  5. Element2 el-tooltip 滚动时 不消失
  6. 计算机一级考试内容有哪些?
  7. 强力删除文件或文件夹
  8. Sketch 57 中文版发布 附下载地址
  9. flutter-border
  10. 给王凌打Call的,原来是神奇的智能湖仓