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

设计模式 - 状态模式

目录

1. 前言

2. 基本原理

3. UML模型

4. 例程


1. 前言

状态模式作为设计模式的一种,主要用于根据状态的改变执行不同的动作,它允许一个对象在其内部状态改变时改变它的行为。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

2. 基本原理

状态模式一般由三个角色组成,分别是Context、State和ConcreteState。其中,Context是直接与调用者对接的类,State是一个抽象类,是一个总的状态描述,调用者并不直接使用State类,而是使用具体化了的ConcreteState类。

ConcreteState类很重要,它包含了当前状态所要执行的动作信息。

3. UML模型

4. 例程

以下以一个简单的驾驶场景为例,我们的交通灯有三种状态,分别是红灯、绿灯和黄灯。我们在驾驶过程中,需要根据不同的交通灯状态来决定驾驶的行为。下面一段程序就是实现了“红灯停,绿灯行,黄灯亮了等一等”。

#include <iostream>  #include <string>  /** 抽象状态类. */class LightState{  public:  virtual void HandleState(std::string& light) = 0;  virtual ~LightState() {}  };  /** 具体状态-红灯. */class RedLightState: public LightState{  public:  void HandleState(std::string& light) override {  light = "Red";  std::cout << "Stop!" << std::endl;  }  };  /** 具体状态-绿灯. */class GreenLightState: public LightState{public:  void HandleState(std::string& light) override {  light = "Green";  std::cout << "Go!" << std::endl;  }  };  /** 具体状态-黄灯. */class YellowLightState: public LightState{public:  void HandleState(std::string& light) override {  light = "Yellow";  std::cout << "Slow down and wait!" << std::endl;  }  };  /** 状态向下文. */  class TrafficLightContext{public:  TrafficLightContext(LightState* state) : state(state){}  void SetState(LightState* state){this->state = state;  }  void Operation(){std::string light = "Unknown";  state->HandleState(light);  std::cout << "Current light is: " << light << std::endl;  }  private:  LightState* state;};  int main(int argc, char* argv[]){TrafficLightContext context(new RedLightState());  context.Operation();  context.setState(new GreenLightState());  context.Operation();  context.setState(new YellowLightState());  context.Operation();  return 0;  }

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 详解使用Goalng+Redis实现分布式锁
  • haralyzer 半自动,一次性少量数据采集快捷方法
  • C++系列-继承中的对象模型
  • Spring Boot 使用 MongoDB 教程
  • SpringBoot日志整合
  • 大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
  • 第五天:java网络编程、JDBC与高级特性概览
  • 推荐一个根据后台提供的接口json文件自动生成前端调用接口的插件typescript
  • Mysql基础篇
  • Java高级Day28-让坦克动起来
  • 保命指南,家里有浮毛、异味竟会危害健康?去浮毛空气净化器推荐
  • vue的混入介绍
  • 我常用的几个傻瓜式爬虫工具,收藏!
  • Luminar Neo for Mac/Win:创新AI图像编辑软件的强大功能
  • vuex properties of undefined (reading ‘getters‘)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 0x05 Python数据分析,Anaconda八斩刀
  • Apache的基本使用
  • CSS 专业技巧
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • IDEA常用插件整理
  • java 多线程基础, 我觉得还是有必要看看的
  • Javascript编码规范
  • js中forEach回调同异步问题
  • NSTimer学习笔记
  • React的组件模式
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue2.x学习三:事件处理生命周期钩子
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 分布式事物理论与实践
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 盘点那些不知名却常用的 Git 操作
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 学习Vue.js的五个小例子
  • 在weex里面使用chart图表
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • Python 之网络式编程
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​520就是要宠粉,你的心头书我买单
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #java学习笔记(面向对象)----(未完结)
  • (007)XHTML文档之标题——h1~h6
  • (C++20) consteval立即函数
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (办公)springboot配置aop处理请求.
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (苍穹外卖)day03菜品管理
  • (生成器)yield与(迭代器)generator
  • (一)UDP基本编程步骤
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'