1.应用场景

在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理。最直接的解决方案是将这些所有可能发生的情况全都考虑到。然后使用if… ellse语句来做状态判断来进行不同情况的处理。但是对复杂状态的判断就显得“力不从心了”。随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱。维护也会很麻烦。那么我就考虑只修改自身状态的模式。

例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,运行。每一种状态改变,都有可能要根据其他状态来更新处理。例如,开门状体,你不能在运行的时候开门,而是在电梯定下后才能开门。

例子2:我们给一部手机打电话,就可能出现这几种情况:用户开机,用户关机,用户欠费停机,用户消户等。 所以当我们拨打这个号码的时候:系统就要判断,该用户是否在开机且不忙状态,又或者是关机,欠费等状态。但不管是那种状态我们都应给出对应的处理操作。

2. 概念

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

这个模式将状态封装成了独立的类,并且将动作委托到代表当前状态的对象上,我们知道行为会随着内部状态的改变而改变。

3.Class Diagram

Context(上下文)是一个类,它可以拥有一些内部状态。

State接口定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样一来,状态之间可以互相替换。

4. Implementation

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

public interface State {public void insertQuarter();public void ejectQuarter();public void turnCrank();public void dispense();public void refill();
}public class SoldState implements State {GumballMachine gumballMachine;public SoldState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}public void insertQuarter() {System.out.println("Please wait, we're already giving you a gumball");}public void ejectQuarter() {System.out.println("Sorry, you already turned the crank");}public void turnCrank() {System.out.println("Turning twice doesn't get you another gumball!");}public 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 void refill() { }public String toString() {return "dispensing a gumball";}
}public class SoldOutState implements State {GumballMachine gumballMachine;public SoldOutState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}public void insertQuarter() {System.out.println("You can't insert a quarter, the machine is sold out");}public void ejectQuarter() {System.out.println("You can't eject, you haven't inserted a quarter yet");}public void turnCrank() {System.out.println("You turned, but there are no gumballs");}public void dispense() {System.out.println("No gumball dispensed");}public void refill() { gumballMachine.setState(gumballMachine.getNoQuarterState());}public String toString() {return "sold out";}
}public class NoQuarterStete implements State {private GumballMachine gumballMachine;public NoQuarterStete(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}@Overridepublic void insertQuarter() {System.out.println("You inserted a quarter");gumballMachine.setState(gumballMachine.hasQuarterState);}@Overridepublic void ejectQuarter() {System.out.println("You haven't inserted 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");}@Overridepublic void refill() {}
}public class NoQuarterState implements State {GumballMachine gumballMachine;public NoQuarterState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}public void insertQuarter() {System.out.println("You inserted a quarter");gumballMachine.setState(gumballMachine.getHasQuarterState());}public void ejectQuarter() {System.out.println("You haven't inserted a quarter");}public void turnCrank() {System.out.println("You turned, but there's no quarter");}public void dispense() {System.out.println("You need to pay first");} public void refill() { }public String toString() {return "waiting for quarter";}
}public class HasQuarterState implements State {GumballMachine gumballMachine;public HasQuarterState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}public void insertQuarter() {System.out.println("You can't insert another quarter");}public void ejectQuarter() {System.out.println("Quarter returned");gumballMachine.setState(gumballMachine.getNoQuarterState());}public void turnCrank() {System.out.println("You turned...");gumballMachine.setState(gumballMachine.getSoldState());}public void dispense() {System.out.println("No gumball dispensed");}public void refill() { }public String toString() {return "waiting for turn of crank";}
}public class GumballMachine {State soldOutState;State noQuarterState;State hasQuarterState;State soldState;State state;int count = 0;public GumballMachine(int numberGumballs) {soldOutState = new SoldOutState(this);noQuarterState = new NoQuarterState(this);hasQuarterState = new HasQuarterState(this);soldState = new SoldState(this);this.count = numberGumballs;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();}void releaseBall() {System.out.println("A gumball comes rolling out the slot...");if (count != 0) {count = count - 1;}}int getCount() {return count;}void refill(int count) {this.count += count;System.out.println("The gumball machine was just refilled; it's new count is: " + this.count);state.refill();}void setState(State state) {this.state = state;}public State getState() {return state;}public State getSoldOutState() {return soldOutState;}public State getNoQuarterState() {return noQuarterState;}public State getHasQuarterState() {return hasQuarterState;}public State getSoldState() {return soldState;}public String toString() {StringBuffer result = new StringBuffer();result.append("\nMighty Gumball, Inc.");result.append("\nJava-enabled Standing Gumball Model #2004");result.append("\nInventory: " + count + " gumball");if (count != 1) {result.append("s");}result.append("\n");result.append("Machine is " + state + "\n");return result.toString();}
}public class GumballMachineTestDrive {public static void main(String[] args) {GumballMachine gumballMachine = new GumballMachine(2);System.out.println(gumballMachine);gumballMachine.insertQuarter();gumballMachine.turnCrank();System.out.println(gumballMachine);gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.refill(5);gumballMachine.insertQuarter();gumballMachine.turnCrank();System.out.println(gumballMachine);}
}

Java设计模式(十二):状态设计模式相关推荐

  1. 设计模式十二之组合模式

    设计模式十二之组合模式 1. 模式的定义与特点 1.1 模式的定义 1.2 模式的特点 1.3 模式的使用场景 2. 模式的结构与实现 2.1 模式的结构 2.2 模式的实现 3. 模式在开源软件中的 ...

  2. 设计模式示例_状态设计模式示例

    设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...

  3. 吃透这JAVA并发十二核心,面试官都得对你刮目相看

    1.HashMap 面试第一题必问的 HashMap,挺考验Javaer的基础功底的,别问为啥放在这,因为重要!HashMap具有如下特性: HashMap 的存取是没有顺序的. KV 均允许为 NU ...

  4. JAVA并发十二连招

    1.HashMap 面试第一题必问的 HashMap,挺考验Javaer的基础功底的,别问为啥放在这,因为重要!HashMap具有如下特性: HashMap 的存取是没有顺序的. KV 均允许为 NU ...

  5. 设计模式(二)设计模式的本质

    简介 设计模式是计算机前辈们,总结项目开发成败经验,得出的一套最佳实践理论.它并不是高高在上.不切实际的理论,而是具体到代码编写层面的指导理论. 从学习编写代码开始,我们就被教导,要写高内聚.低耦合. ...

  6. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对"状态模式"并不陌生,因为我们之前使用到了状态模式进行 ...

  7. (设计模式十二)java设计模式之享元模式

    转载请标明出处:https://blog.csdn.net/jason0539/article/details/22908915 解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份 ...

  8. 多线程十二种设计模式详解

    文章目录 前言 多线程程序的评价标准 Single Threaded Execution 模式 Single Threaded Execution 模式简介 Single Threaded Execu ...

  9. GoF设计模式(十二) - 享元模式

    前言 享元模式(Flyweight Pattern)运用共享技术有效地支持大量细粒度的对象,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的 ...

最新文章

  1. Python游戏开发,Pygame模块,Python从零开始带大家实现魔塔小游戏
  2. 2021年大数据研究中心支持项目交流会成功举行
  3. linux如何捕获9的信号,2018-9-17-bash之信号捕捉
  4. [2021-09-04 AtCoder Beginner Contest 217] 题解
  5. Spring Boot端口从默认更改为自定义或新端口
  6. 单目相机 svd 从图像恢复3维位置_论文学习——VINSMono:一种鲁棒且通用的单目视觉惯性系统...
  7. stream去重_重复数据如何处理?List集合去重的四种方式
  8. ffmpeg转mp4格式
  9. 函数栈帧的创建和销毁图解
  10. python备份文件最简单案例_Python实现备份文件实例
  11. java登陆session用法_java中session用法
  12. 学硕论文选题计算机,研究生计算机论文题目大全 研究生计算机论文题目哪个好...
  13. RubyInstallers无法下载或下载缓慢的问题
  14. 调整计算机硬盘大小,分区助手调整硬盘分区大小图文教程?
  15. xml文件中servlet映射重复问题,也是导致tomcat启动不了,出现在Java 9上运行时,需在JVM命令行参数中添加“-add opens=Java.base/Java.lang=ALL-U
  16. 学习shell的第二天
  17. 蒙氏素材1-1000珠链标签蒙特梭利教具
  18. ENVI下Landsat8大气校正法反演地表温度
  19. jdk8 HashMap底层原理
  20. Docker(一):什么是Docker?

热门文章

  1. oi程序提交注意:bool
  2. 前台获取后台数据写法%#%..
  3. leetcode 110. 平衡二叉树
  4. STM32F103固件库编程:关于core_cm3.c的错误
  5. C#编程语言之MD5加密的两种方式
  6. Python3 内置http.client,urllib.request及三方库requests发送请求对比
  7. 人工智能学什么?专家表示基础科学教育需发力
  8. matlab 读取WAV文件
  9. 服务器损坏文件怎么办,服务器文件系统损坏的处理
  10. linux基础试卷笔试,顽石系列:Linux基础笔试