设计模式 - 状态模式

article/2025/9/22 10:10:06

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

http://chatgpt.dhexx.cn/article/xxINdlmt.shtml

相关文章

此页面处于怪异模式,排版布局可能会受到影响。若需要标准模式,请使用“!DOCTYPE html”。

一、报错二、原因 一、报错 此页面处于怪异模式,排版布局可能会受到影响。若需要标准模式,请使用“!DOCTYPE html”。详细了解 导致:页面打开是空的,什么内容也没有~ 二、原因 用框架渲染页面的时候,视图渲染语句漏…

HTML的标准模式与怪异模式

HTML的标准模式与怪异模式 HTML 的结构在HTML4中 DOCTYPE有三种模式标准模式与怪异模式 HTML 的结构 <html><head><meta charset"utf-8" /><title></title></head><body></body> </html>上面就是一个完整的h…

准标准模式和标准模式之间的差别-1(旧文首发)

"理论上&#xff0c;标准模式和准标准模式的区别仅在于非IE6/7浏览器对于单元格里(原文说法可能有误&#xff0c;经测试所有图片均受影响)图片布局的不同处理。同事渔隐做了细致地测试并给出了解决方案。 Update 20100203&#xff1a;发现iframe的布局也受到影响&#xff…

设计模式:(状态模式)

1.定义 在状态模式&#xff08;State Pattern&#xff09;中&#xff0c;类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中&#xff0c;我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 简单来说&#xff1a;状…

设计模式第10式:状态模式

前言 我们遇到状态机模型&#xff0c;常常会理不清“状态”和“行为”的关系。状态模式就是专门解决这个应用场景的&#xff0c;它通过改变对象内部的状态来帮助对象控制自己的行为。 正文 1、先来看一个案例 我们选取《HeadFirst 设计模式》中的糖果售卖机案例。这就是常见…

# 设计模式

设计模式 文章目录 设计模式设计模式总览单例模式类图定义特点单例模式的实现方式 工厂模式类图定义特点实现方式 抽象工厂模式类图定义特点实现方式 观察者模式类图简单理解使用场景实例代码 策略模式类图简单理解使用场景实例代码 模板方法模式类图简单理解实例代码 原型模式…

安全漏洞与网络攻击

目录 一、安全漏洞及产生原因 1. 安全漏洞概念 2. 漏洞产生的技术原因 3. 漏洞产生的经济原因 二、信息收集与分析 1. 攻击的过程 2. 信息收集&#xff1a;攻击的前奏 3. 收集什么信息 4. 信息收集与分析工具 5. 公开信息收集-搜索引擎 6. 信息收集与分析 7. 信息收…

网络安全学习-WEB安全常见漏洞

注入类漏洞 SQL注入漏洞 定义 sql注入漏洞&#xff0c;就是将用户可控的数据拼接到了sql语句当中&#xff0c;一起提交到了数据库执行。 攻*击者通过注入语句&#xff0c;改变sql执行的逻辑&#xff0c;通过控制部分sql语句&#xff0c;攻击者可以查询到数据库钟任何自己需要…

网站安全漏洞--大全

原文网址&#xff1a;网站安全漏洞--大全_IT利刃出鞘的博客-CSDN博客 简介 本文介绍网站常见的一些安全漏洞。 常见的漏洞有&#xff1a;SQL 注入、越权操作、跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、DDoS 攻击、JSON 劫持、暴力破解、HTTP 报头追踪漏洞、信息泄露、文件上…

Springboot -- 网络安全漏洞处理

文章目录 不安全的 HTTP 方法以及 Nginx 屏蔽版本号显示说明检测方式不安全的 HTTP 方法 处理代码屏蔽 Nginx 版本号显示 点击劫持漏洞说明什么是ClickJacking检测方式处理代码 XSS跨站脚本攻击说明检测方式处理代码 &#xff08;参考网上的代码&#xff0c;主要是对传入的信息…

网络安全实验3 漏洞扫描

赞赏码 & 联系方式 & 个人闲话 【实验名称】漏洞扫描 【实验目的】 1.熟悉X-Scan工具的使用方法&#xff1b; 2.熟悉FTPScan工具的使用方法&#xff1b; 3.会使用工具查找主机漏洞 4.学会对弱口令的利用 5.了解开启主机默认共享以及在命令提示下开启服务的方法 …

网络安全技能大赛D模块常规漏洞加固详解

一、 说明&#xff1a; 1.所有截图要求截图界面、 字体清晰&#xff1b; 2.文件名命名及保存&#xff1a; 网络安全模块 D- XX&#xff08;XX为工位号&#xff09;&#xff0c; PDF 格式保存&#xff1b; 3.文件保存到 U盘提交。 4.linux 系统 root 密码 123456&#xff1b; 请…

2022年统计的27个网络安全漏洞数据信息

网络安全漏洞通常是指软件代码中允许攻击者访问网络或系统的缺陷。漏洞使企业和个人面临一系列威胁&#xff0c;包括恶意软件和帐户接管。 他们的漏洞利用存在大量可能的漏洞和潜在后果。美国政府的国家漏洞数据库 (NVD)由常见漏洞和暴露 (CVE) 列表提供&#xff0c;目前有超过…

计算机漏洞分几个等级,网络安全漏洞可以分为各个等级,A级漏洞表示?

满意答案 某匪kevin 2013.04.04 采纳率&#xff1a;44% 等级&#xff1a;11 已帮助&#xff1a;5835人 答案时B ----------------分级原则----------- 对漏洞分级有助于在漏洞被发现后&#xff0c;提供用户更多的信息以便于更快的给漏洞定位&#xff0c;并决定下一步采取的措…

网络安全常见漏洞原理及其防御

目录 1.SQL注入 1.1原理 1.2注入演示 1.3防御 1.4 补充 2.xss&#xff08;跨站脚本攻击&#xff09; 2.1 原理 2.2 注入演示 2.3防御 3.csrf&#xff08;跨站点请求伪造&#xff09; 3.1原理 3.2 注入演示 3.3 防御 4.文件上传 4.1原理 4.2 攻击演示 4.3防御 1.…

医疗器械网络安全漏洞自评报告模板

提示&#xff1a;编制医疗器械网络安全漏洞自评报告要点解析 文章目录 1. 目的2. 引用文件3. CVSS漏洞等级3.1 概述3.1.1 适用范围说明3.1.2 CNNVD-ID定义3.1.3 编码原则3.1.4 CNNVD-ID语法介绍 3.2 指标分析3.2.1 基本指标3.2.1.1可用性指标1)攻击向量2)攻击复杂性3)所需权限4…

Web网络安全漏洞分析,SQL注入原理详解

本文主要为大家介绍了Web网络安全漏洞分析SQL注入的原理详解&#xff0c;有需要的朋友可以借鉴参考下&#xff0c;希望能够有所帮助&#xff0c;祝大家多多进步&#xff0c;早日升职加薪 一、SQL注入的基础 1.1 介绍SQL注入 SQL注入就是指Web应用程序对用户输入数据的合法性没…

信息安全技术 网络安全漏洞分类分级指南(GB/T 30279-2020 )

文章目录 前  言1 范围2 规范性引用文件3 术语和定义4 缩略语5 网络安全漏洞分类5.1 概述5.2 代码问题5.3 配置错误5.4 环境问题5.5 其他 6 网络安全漏洞分级6.1 概述6.2 网络安全漏洞分级指标6.3 网络安全漏洞分级方法 附 录 A&#xff08;规范性附录&#…

计算机网络存在的漏洞,常见的计算机网络安全漏洞有哪些

当今的世界呈现网络信息化、网络全球化的发展大趋势。因此&#xff0c;我们应该竭尽全能地享受其带来的优势和便利&#xff0c;让信息网络为人类的生活进行健康服务。同时&#xff0c;我们还应该采取一切措施将各类危害网络信息安全的病毒清扫干净。只有防患于未然&#xff0c;…

信安软考 第十三章 网络安全漏洞防护技术原理

一、网络安全漏洞概述 1.1 网络安全漏洞概念 网络安全漏洞又称为脆弱性&#xff0c;简称漏洞。漏洞一般是致使网络信息系统安全策略相冲突的缺陷&#xff0c;这种缺陷通常被称为安全隐患。安全漏洞的影响主要有机密性受损、完整性破坏、可用性降低、抗抵赖性缺失、可控性下降、…