当前位置: 首页 > news >正文

8. 状态模式

目录

  • 一、应用背景
  • 二、状态模式
    • 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.dtcms.com/a/300436.html

相关文章:

  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情分析实现
  • vLLM 的“投机取巧”:Speculative Decoding 如何加速大语言模型推理
  • Spring Boot2错误处理
  • 负载均衡 LoadBalance
  • Spring Boot音乐服务器项目-查询音乐模块
  • 《Foundation 面板:设计、功能与最佳实践解析》
  • Java学习-------序列化与反序列化
  • UV: 下一代 Python 包管理工具
  • golang--虚拟地址空间
  • 阿里 Qwen3 四模型齐发,字节 Coze 全面开源,GPT-5 8 月初发布!| AI Weekly 7.21-7.27
  • 批量重命名带编号工具,附免费地址
  • Android网络框架封装 ---> Retrofit + OkHttp + 协程 + LiveData + 断点续传 + 多线程下载 + 进度框交互
  • linux根据pid获取服务目录
  • 一场关于电商零售增长破局的深圳探索
  • Vulnhub red靶机渗透攻略详解
  • PHP框架之Laravel框架教程:2. 控制器、路由、视图简单介绍
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现标签条码一维码的检测(C#代码,UI界面版)
  • WPFC#超市管理系统(2)顾客管理、供应商管理、用户管理
  • MySQL ROUTER安装部署
  • EasyExcel使用(二:写出)
  • git 提交时排除一个或多个文件
  • mac系统彻底删除mysql并重装
  • 【LeetCode】LRU 缓存 题解
  • 在Podman/Docker容器中为Luckfox Lyra Zero W编译SDK:终极排错指南
  • C 语言第 10 天学习笔记:字符串基础操作与相关函数
  • 在docker中安装frp实现内网穿透
  • Libevent(4)之使用教程(3)配置
  • 比特币运行机制全解析:区块链、共识算法与数字黄金的未来挑战
  • 【micro:bit】从入门到放弃(八):超声波测距、小车巡线、红外避障
  • Redis对象机制详解