Java设计模式(十二):状态设计模式
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.2 模式的特点 1.3 模式的使用场景 2. 模式的结构与实现 2.1 模式的结构 2.2 模式的实现 3. 模式在开源软件中的 ...
- 设计模式示例_状态设计模式示例
设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...
- 吃透这JAVA并发十二核心,面试官都得对你刮目相看
1.HashMap 面试第一题必问的 HashMap,挺考验Javaer的基础功底的,别问为啥放在这,因为重要!HashMap具有如下特性: HashMap 的存取是没有顺序的. KV 均允许为 NU ...
- JAVA并发十二连招
1.HashMap 面试第一题必问的 HashMap,挺考验Javaer的基础功底的,别问为啥放在这,因为重要!HashMap具有如下特性: HashMap 的存取是没有顺序的. KV 均允许为 NU ...
- 设计模式(二)设计模式的本质
简介 设计模式是计算机前辈们,总结项目开发成败经验,得出的一套最佳实践理论.它并不是高高在上.不切实际的理论,而是具体到代码编写层面的指导理论. 从学习编写代码开始,我们就被教导,要写高内聚.低耦合. ...
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对"状态模式"并不陌生,因为我们之前使用到了状态模式进行 ...
- (设计模式十二)java设计模式之享元模式
转载请标明出处:https://blog.csdn.net/jason0539/article/details/22908915 解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份 ...
- 多线程十二种设计模式详解
文章目录 前言 多线程程序的评价标准 Single Threaded Execution 模式 Single Threaded Execution 模式简介 Single Threaded Execu ...
- GoF设计模式(十二) - 享元模式
前言 享元模式(Flyweight Pattern)运用共享技术有效地支持大量细粒度的对象,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的 ...
最新文章
- Python游戏开发,Pygame模块,Python从零开始带大家实现魔塔小游戏
- 2021年大数据研究中心支持项目交流会成功举行
- linux如何捕获9的信号,2018-9-17-bash之信号捕捉
- [2021-09-04 AtCoder Beginner Contest 217] 题解
- Spring Boot端口从默认更改为自定义或新端口
- 单目相机 svd 从图像恢复3维位置_论文学习——VINSMono:一种鲁棒且通用的单目视觉惯性系统...
- stream去重_重复数据如何处理?List集合去重的四种方式
- ffmpeg转mp4格式
- 函数栈帧的创建和销毁图解
- python备份文件最简单案例_Python实现备份文件实例
- java登陆session用法_java中session用法
- 学硕论文选题计算机,研究生计算机论文题目大全 研究生计算机论文题目哪个好...
- RubyInstallers无法下载或下载缓慢的问题
- 调整计算机硬盘大小,分区助手调整硬盘分区大小图文教程?
- xml文件中servlet映射重复问题,也是导致tomcat启动不了,出现在Java 9上运行时,需在JVM命令行参数中添加“-add opens=Java.base/Java.lang=ALL-U
- 学习shell的第二天
- 蒙氏素材1-1000珠链标签蒙特梭利教具
- ENVI下Landsat8大气校正法反演地表温度
- jdk8 HashMap底层原理
- Docker(一):什么是Docker?
热门文章
- oi程序提交注意:bool
- 前台获取后台数据写法%#%..
- leetcode 110. 平衡二叉树
- STM32F103固件库编程:关于core_cm3.c的错误
- C#编程语言之MD5加密的两种方式
- Python3 内置http.client,urllib.request及三方库requests发送请求对比
- 人工智能学什么?专家表示基础科学教育需发力
- matlab 读取WAV文件
- 服务器损坏文件怎么办,服务器文件系统损坏的处理
- linux基础试卷笔试,顽石系列:Linux基础笔试