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

行为设计模式之状态模式

文章目录

  • 概述
    • 定义
    • 结构图
  • 2.代码示例
  • 小结

概述

定义

状态模式(state pattern)的定义: 允许一个对象在其内部状态改变时改变它的行为。 对象看起来似乎修改了它的类。

状态模式就是用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中(用类来表示状态) ,使得对象状态可以灵活变化。

结构图

状态模式结构图

  • 上下文信息类(Context):实际上就是存储当前状态的类,对外提供更新状态的操作。在该类中维护着一个抽象状态接口State实例,这个实例定义当前状态.

  • 抽象状态类(State):可以是一个接口或抽象类,用于定义声明状态更新的操作方法有哪些,具体实现由子类完成。

  • 具体状态类(StateA 等):实现抽象状态类定义的方法,根据具体的场景来指定对应状态改变后的代码实现逻辑。

2.代码示例

// 抽象状态类
class State {
public:virtual void Handle(std::string input, std::shared_ptr<State> &currentState) = 0;
};// 具体状态A
class StateA : public State {
public:void Handle(std::string input, std::shared_ptr<State> &currentState) override {if (input == "A") {std::cout << "StateA: Handle input A." << std::endl;} else if (input == "B") {std::cout << "StateA: Transition to StateB." << std::endl;currentState = std::make_shared<StateB>();} else {std::cout << "StateA: Invalid input." << std::endl;}}
};// 具体状态B
class StateB : public State {
public:void Handle(std::string input, std::shared_ptr<State> &currentState) override {if (input == "B") {std::cout << "StateB: Handle input B." << std::endl;} else if (input == "C") {std::cout << "StateB: Transition to StateC." << std::endl;currentState = std::make_shared<StateC>();} else {std::cout << "StateB: Invalid input." << std::endl;}}
};// 具体状态C
class StateC : public State {
public:void Handle(std::string input, std::shared_ptr<State> &currentState) override {if (input == "C") {std::cout << "StateC: Handle input C." << std::endl;} else if (input == "A") {std::cout << "StateC: Transition to StateA." << std::endl;currentState = std::make_shared<StateA>();} else {std::cout << "StateC: Invalid input." << std::endl;}}
};// 上下文类,维护当前状态并执行请求
class Context {
private:std::shared_ptr<State> currentState;
public:Context(std::shared_ptr<State> initialState) : currentState(initialState) {}void Request(std::string input) {currentState->Handle(input, currentState);}
};

小结

这篇文章主要说了状态模式的定义,结构图,以及代码示例;这些都很常用的,不管是生活中,还是开发中,都是这样的。道理呢,往往很简单,看看代码示例,再想想现实生活,可能就理解了。OK,翻篇。

http://www.lryc.cn/news/362448.html

相关文章:

  • 找回以前的视频:技术与实践3个指南
  • GCN 代码解析(一) for pytorch
  • 2024年云计算、信号处理与网络技术国际学术会议(ICCCSPNT 2024)
  • 希尔排序法
  • thinkphp6.0版本下子查询sql处理
  • flowable工作流 完成任务代码 及扩展节点审核人(实现多级部门主管 审核等)详解【JAVA+springboot】
  • 【电源专题】一体成型电感为什么需要注意耐压问题
  • 如何看待时间序列与机器学习?
  • vue图标不显示
  • 文件夹如何加密码全攻略,5个文件夹加密方法新手也能学
  • useState和store的区别
  • vscode远程登录阿里云服务器【使用密钥方式--后期无需再进行密码登录】【外包需要密码】
  • 解决uniapp里的onNavigationBarSearchInputClicked不生效
  • Windows下搭建Cmake编译环境进行C/C++文件的编译
  • 实用新型专利申请材料的撰写与准备
  • 代码随想录算法训练营第60天|● 84.柱状图中最大的矩形
  • 让AI给你写代码(9.3):一点改进,支持扩展本地知识库
  • 探索煤化工厂巡检机器人的功能、应用及前景
  • 【活动】GPT-4O:AI语言生成技术的新里程碑
  • 实验笔记之——DPVO(Deep Patch Visual Odometry)
  • 力扣----轮转数组
  • 哥斯拉、冰蝎、中国蚁剑在护网中流量特征分析,收藏起来当资料吧,24年护网用得上
  • 隐藏饼图的legend,重写legend列表。
  • 解决在Mac下使用npm报错:Error: EACCES: permission denied
  • pvt对net delay的影响
  • 力扣5 最长回文子串
  • 【Uniapp小程序】自定义导航栏uni-nav-bar滚动渐变色
  • HarmonyOS鸿蒙学习笔记(25)相对布局 RelativeContainer详细说明
  • 自然语言处理学习中英文翻译语料库
  • 可视化数据科学平台在信贷领域应用系列二:数据清洗