目录

  • 一、应用背景
  • 二、状态模式
    • 2.1 解决的问题
    • 2.2 角色
    • 2.3 实现步骤
  • 三、通用设计类图
  • 四、实现
    • 4.1 设计类图
    • 4.2 状态转换图
    • 4.3 代码实现

一、应用背景

  • 某对象发生变化时,其所能做的操作也随之变化。
  • 应用程序的可维护性和重用性差
  • 代码的逻辑较复杂

二、状态模式

2.1 解决的问题

  • 允许一个对象在其内部状态改变时改变化的行为

2.2 角色

  • 环境类(Context):客户使用的对象料。维护一个State子类的实例,这个实例定义当前状态
  • 抽象状态类(State):定义一个抽象以封装瑟Context的一个特定状态相关的行为
  • 具体状态类(ConcreteState):每一子类实现一个与Context的一个状态相关的行为

2.3 实现步骤

  • 定义抽象状态类,实现当前系统的真实状态继承自此抽象状态类
  • 定义Context类,具有状态的类,其中包含抽象状态类的对象
  • 定义具体状态类,实现当前系统的真实状态类
    • 当Context类执行某个接口的方法时,去调用真实状态类的实现方法
    • 当Context类修改状态时,修改Context类的真实状态对象

三、通用设计类图

在这里插入图片描述

  • Context:上下文/环境类,即状态的拥有者
  • State:抽取出的抽象状态类,里面规定了该类拥有的行
  • Concrete StateA:具体的状态类

四、实现

  • 设置酒店房间管理功能

4.1 设计类图

在这里插入图片描述

  • 房间类:环境类,状态拥有者
  • 房间状态类:抽象类,定义房间的状态信息
  • xxx状态类:各种不同的房间状态信息,继承自房间状态类

4.2 状态转换图

在这里插入图片描述

4.3 代码实现

#include <iostream>class Room;class State
{
public:virtual std::string getState() = 0;virtual void book(Room* room) = 0;virtual void checkin(Room* room) = 0;virtual void unbook(Room* room) = 0;virtual void checkout(Room* room) = 0;
};class Room
{
protected:State* s;public:std::string getState(){return s->getState();}void setState(State* a){s = a;}void book(){s->book(this);}void checkin(){s->checkin(this);}void unbook(){s->unbook(this);}void checkout(){s->checkout(this);}
};class FreeState : public State
{
public:std::string getState() override{return "当前为空闲状态";}void book(Room* room) override;void checkin(Room* room) override;void unbook(Room* room) override{std::cout << "当前为空闲状态,无法进行取消预定操作" << std::endl;}void checkout(Room* room) override{std::cout << "当前为空闲状态,无法进行退房操作" << std::endl;}
};class BookState : public State
{
public:std::string getState() override{return "当前为预定状态";}void book(Room* room) override{std::cout << "当前已经是预定状态,无须重复预订" << std::endl;}void checkin(Room* room) override;void unbook(Room* room) override;void checkout(Room* room) override{std::cout << "当前是预定状态,无须退房" << std::endl;}
};class CheckinState : public State
{
public:std::string getState() override{return "当前为入住状态";}void book(Room* room) override{std::cout << "当前是入住状态,无法预定" << std::endl;}void checkin(Room* room) override{std::cout << "当前是入住状态,无须重复入住" << std::endl;}void unbook(Room* room) override{std::cout << "当前是入住状态,无法取消预定" << std::endl;}void checkout(Room* room) override{std::cout << "退房操作" << std::endl;room->setState(new FreeState());}
};void FreeState::book(Room* room)
{std::cout << "预订操作" << std::endl;room->setState(new BookState());
}void FreeState::checkin(Room* room)
{std::cout << "入住操作" << std::endl;room->setState(new CheckinState());
}void BookState::checkin(Room* room)
{std::cout << "入住操作" << std::endl;room->setState(new CheckinState());
}void BookState::unbook(Room* room)
{std::cout << "取消预订操作" << std::endl;room->setState(new FreeState());
}int main()
{Room* r = new Room();State* s = new FreeState();r->setState(s);std::cout << "=============================" << std::endl;std::cout << r->getState() << std::endl;std::cout << "=============================" << std::endl;r->checkin();std::cout << r->getState() << std::endl;std::cout << "=============================" << std::endl;r->checkout();r->book();r->checkout();std::cout << r->getState() << std::endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90744.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90744.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/90744.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php语法--foreach和in_array的使用

文章目录foreach基础语法&#xff1a;案例1&#xff1a;引用传递模式&#xff1a;嵌套数组处理&#xff1a;避免在循环中计算数组长度&#xff1a;使用引用减少内存拷贝&#xff1a;打印数组in_array基础使用严格使用foreach 基础语法&#xff1a; foreach ($iterable as $va…

ES6模块详解:核心语法与最佳实践

以下是 EMAScript 6&#xff08;ES6&#xff09;模块规范的核心要点及细节解析&#xff1a; &#x1f4e6; 一、核心语法导出&#xff08;export&#xff09; 命名导出&#xff1a;支持导出多个具名成员。export const a 1; export function b() { /* ... */ } // 或集中导出 …

Python day25

浙大疏锦行 Python day25. 内容&#xff1a; 异常处理&#xff0c;在日常的编码工作过程中&#xff0c;为了避免由于各种bug导致的异常情况&#xff0c;我们需要引入异常处理机制&#xff0c;它的工作场景是当程序运行出现意外时&#xff0c;可以根据编码规则处理响应的错误。…

mac llama_index agent算术式子计算示例

本文通过简单数学计算&#xff0c;示例llama_index使用agent解决复杂任务过程。 假设mac本地llama_index环境已安装&#xff0c;过程参考 mac测试ollama llamaindex-CSDN博客 测试mac笔记本内存8G&#xff0c;所以使用较小LLM完成示例。 ollama pull qwen3:1.7b qwen3:1.7b能…

uni-app小程序云效持续集成

创建项目 必须是 cli 命令行创建的 uni-app 小程序项目参考uni-app官方构建命令&#xff1a; npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project生成小程序代码上传密钥 管理-开发设置-小程序代码上传生成的文件放在根目录即可 安装持续集成插件 pnpm install uni-mi…

uniapp+高德地图实现打卡签到、打卡日历

一、注册高德地图。应用管理创建应用&#xff0c;分别添加Andriod平台、Web服务、Web端、微信小程序四种类型的key。二、考勤规则打卡地点选择位置代码&#xff1a;<script setup lang"ts"> import { onMounted, onUnmounted, reactive, ref, watchEffect } fr…

CentOS 7.9 + GCC9 离线安装 IWYU(Include What You Use)

本教程适用于 离线环境下在 CentOS 7.9 系统中使用 GCC 9 离线安装 IWYU 的完整步骤&#xff0c;涵盖 Clang 11.1.0 编译、IWYU 构建以及头文件自动优化流程。&#x1f4e5; 一、准备安装包请提前下载以下源码包&#xff08;可通过在线机器提前下载&#xff0c;再传输到离线环境…

基于Dapr Sidecar的微服务通信框架设计与性能优化实践

基于Dapr Sidecar的微服务通信框架设计与性能优化实践 一、技术背景与应用场景 随着微服务架构的广泛应用&#xff0c;分布式系统中服务间通信、可观察性、可靠性等问题日益凸显。Dapr&#xff08;Distributed Application Runtime&#xff09;作为一个开源的微服务运行时&…

Claude Code 超详细完整指南(2025最新版)

&#x1f680; 终端AI编程助手 | 高频使用点 生态工具 完整命令参考 最新MCP配置 &#x1f4cb; 目录 &#x1f3af; 快速开始&#xff08;5分钟上手&#xff09;&#x1f4e6; 详细安装指南 系统要求Windows安装&#xff08;WSL方案&#xff09;macOS安装Linux安装安装验…

【lucene】SegmentReader初始化过程概述

readers[i] new SegmentReader(sis.info(i), sis.getIndexCreatedVersionMajor(), IOContext.READ); 这个方法已经把所有的文件都读完了么&#xff1f;没有“读完”&#xff0c;但已经**全部“打开”**了。| 动作 | 是否发生 | |---|---| | **打开文件句柄 / mmap** | ✅ 立即完…

通俗理解主机的BIOS和UEFI启动方式

“对于 22.04 版本&#xff0c;这些操作说明应适用于通过 BIOS 或 UEFI 两种方式创建和运行启动盘。”我们来详细解释一下这句话的含义&#xff0c;这句话的核心意思是&#xff1a;你按照这个教程制作出来的 Ubuntu U 盘&#xff0c;将拥有极佳的兼容性&#xff0c;无论是在老电…

Canal 1.1.7的安装

数据库操作的准备 1、开启 Binlog 写入功能&#xff0c;配置 binlog-format 为 ROW 模式&#xff0c;my.cnf 中配置如下: vi /etc/my.cnf [mysqld] log-binmysql-bin # 开启 binlog binlog-formatROW # 选择 ROW 模式 server_id1 # 配置 MySQL replaction 需要定义&#xff0c;…

python---类型转换

文章目录1. 基本类型转换函数int() - 转换为整数float() - 转换为浮点数str() - 转换为字符串bool() - 转换为布尔值2. 其他类型转换list() - 转换为列表tuple() - 转换为元组set() - 转换为集合&#xff08;去重&#xff09;dict() - 转换为字典3. 注意事项1. 兼容性&#xff…

JVM terminated. Exit code=1

出现JVM terminated. Exit code1错误通常是因为 Eclipse 所需的 Java 版本与系统中配置的 Java 版本不匹配。从错误信息中可以看到关键线索&#xff1a;-Dosgi.requiredJavaVersion21&#xff0c;表示此 Eclipse 版本需要 Java 21 或更高版本&#xff0c;但系统当前使用的是 Ja…

20250727-1-Kubernetes 网络-Ingress介绍,部署Ingres_笔记

一、NodePort存在的不足 1. 四层负载均衡  实现技术: 基于iptables和ipvs实现 OSI层级: 位于传输层(第四层) 转发依据: 基于IP地址和端口进行转发 特点: 只能看到IP和端口信息 无法识别应用层协议内容 配置简单但功能有限 2. 七层负载均衡 1)七层负载均衡的概念 …

Javaweb————HTTP的九种请求方法介绍

❤️❤️❤️一.HTTP1.0定义的三种请求方式介绍 &#x1f3cd;️&#x1f3cd;️&#x1f3cd;️&#xff08;1&#xff09;GET请求 作用&#xff1a;向服务器获取资源&#xff0c;比如常见的查询请求 应用场景&#xff1a;绝大多数场景&#xff0c;比如我们访问商城首页查看图…

C++day06(练习题)

循序渐进-基础训练 格式化输入输出 【描述】格式化输入输出练习输入三个整数和一个浮点数&#xff0c;浮点数需要保留的不同小数点后面的数字。 【输入描述】三个正整数以及以一个浮点数 【输出描述】三个整数以及保留不同位数的浮点数 【样例输入】 1 2 3 9.12345678 【样例输…

基于大模型的预训练、量化、微调等完整流程解析

随着大语言模型&#xff08;LLM&#xff09;的飞速发展&#xff0c;模型的训练、部署与优化成为了AI工程领域的重要课题。本文将从 预训练、量化、微调 等关键步骤出发&#xff0c;详细介绍大模型的完整技术流程及相关实践。1. 预训练&#xff08;Pre-training&#xff09; 1.1…

AI入门学习-模型评估示例讲解

from sklearn.metrics import classification_report, confusion_matrix from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification# 生成示例分类数据 # n_samples: 样本…

Python编程:初入Python魔法世界

一、常量表达式在编程中&#xff0c;常量指的是在程序执行期间其值不会改变的数据项。虽然 Python 并没有专门的语法来定义常量&#xff08;不像某些其他语言如 Java 中有 final 关键字&#xff09;&#xff0c;但在实践中&#xff0c;我们通常通过约定俗成的方式来表示一个变量…