状态黑板模式
状态黑板模式(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:状态处理器的基类,提供接口供具体处理器实现。
- 具体状态处理器:如
IdleStateHandler
、RunningStateHandler
和StoppedStateHandler
,实现了对黑板状态的处理。 - StateManager:管理当前的状态处理器,并调用其处理方法。
这个简单的实现展示了状态黑板模式的基本结构,可以根据需要扩展更多的功能和复杂性。