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

状态黑板模式

状态黑板模式(State Blackboard Pattern)是一种设计模式,结合了状态模式和黑板模式,常用于复杂系统中进行状态管理和信息共享。它允许多个状态处理器通过一个共享的黑板(数据结构)进行交互,方便地管理和响应不同系统状态。

1、概述

  • 黑板:一个中央数据结构,存储系统的共享状态信息。
  • 状态处理器:多个处理器根据当前状态在黑板上进行操作,可以读取和修改黑板上的数据。

2、优点

  • 解耦:处理器之间不直接相互依赖,降低耦合度。
  • 扩展性:可以轻松添加新的状态处理器或修改现有处理器,适应变化。
  • 动态管理:状态和处理器可以在运行时动态添加、删除或修改。

3、应用场景

  • 游戏AI中的状态管理。
  • 复杂系统的事件处理,如机器人控制。
  • 需要多种状态共同影响的系统。

4、C++代码示例

#include <iostream>
#include <vector>
#include <memory>
#include <string>// 黑板类
class Blackboard {
public:void setData(const std::string& key, const std::string& value) {data[key] = value;}std::string getData(const std::string& key) {return data[key];}private:std::unordered_map<std::string, std::string> data;
};// 状态处理器基类
class StateHandler {
public:virtual ~StateHandler() {}virtual void handle(Blackboard& blackboard) = 0;
};// 具体状态处理器
class IdleStateHandler : public StateHandler {
public:void handle(Blackboard& blackboard) override {std::cout << "Idle state handling..." << std::endl;blackboard.setData("state", "Idle");}
};class RunningStateHandler : public StateHandler {
public:void handle(Blackboard& blackboard) override {std::cout << "Running state handling..." << std::endl;blackboard.setData("state", "Running");}
};class StoppedStateHandler : public StateHandler {
public:void handle(Blackboard& blackboard) override {std::cout << "Stopped state handling..." << std::endl;blackboard.setData("state", "Stopped");}
};// 状态管理器
class StateManager {
public:void setHandler(std::shared_ptr<StateHandler> handler) {currentHandler = handler;}void update(Blackboard& blackboard) {if (currentHandler) {currentHandler->handle(blackboard);}}private:std::shared_ptr<StateHandler> currentHandler;
};// 主函数
int main() {Blackboard blackboard;StateManager stateManager;// 设置不同状态处理器stateManager.setHandler(std::make_shared<IdleStateHandler>());stateManager.update(blackboard);std::cout << "Current state: " << blackboard.getData("state") << std::endl;stateManager.setHandler(std::make_shared<RunningStateHandler>());stateManager.update(blackboard);std::cout << "Current state: " << blackboard.getData("state") << std::endl;stateManager.setHandler(std::make_shared<StoppedStateHandler>());stateManager.update(blackboard);std::cout << "Current state: " << blackboard.getData("state") << std::endl;return 0;
}

说明

  • Blackboard:用于存储和共享状态数据。
  • StateHandler:状态处理器的基类,提供接口供具体处理器实现。
  • 具体状态处理器:如IdleStateHandlerRunningStateHandlerStoppedStateHandler,实现了对黑板状态的处理。
  • StateManager:管理当前的状态处理器,并调用其处理方法。

这个简单的实现展示了状态黑板模式的基本结构,可以根据需要扩展更多的功能和复杂性。


http://www.mrgr.cn/news/56802.html

相关文章:

  • OpenAl如何将RAG的准确率由45%提升至98%
  • pandas 数据分析实战
  • 408算法题leetcode--第38天
  • 【Python爬虫实战】XPath与lxml实现高效XML/HTML数据解析
  • 创建型模式-----(单例模式)
  • 还能报名:向心力|中美 AI 应用与落地分享沙龙
  • 进程间通信大总结Linux
  • 如何学会解决HTTP相关返回值异常?全在这!(上篇)
  • Spring Boot论坛网站:技术要点与案例分析
  • 就是这个样的粗爆,手搓一个计算器:热量计算器
  • springboot高校在线健康咨询服务-计算机设计毕业源码86100
  • css实现外层不换行,内层换行
  • PVE虚拟机强制重启
  • ELK收集nginx日志
  • Stable Diffusion视频插件Ebsynth Utility安装方法
  • S32DS for ARM GPIO实践
  • 基于Spring Boot的论坛网站:从零到部署
  • TensorRT构建的engine文件用途
  • 自动化数据库管理:如何通过存储过程动态创建 MySQL 对象
  • 网盘与移动硬盘优势对比
  • 请求转发和重定向
  • 动态规划20:918. 环形子数组的最大和
  • 私募基金大屏粒子效果和动画闪烁效果 vue3+js
  • 4步教你绘制流程图,轻松提高工作效率!
  • PL/I语言的起源?有C语言,有B语言和A语言吗?为什么shell脚本最开始可能有#!/bin/bash字样?为什么不支持嵌套注释?
  • javascript实现sha256算法,支持分多次计算