c++观察者模式实现消息机制
时间: 2023-08-02 08:05:45 浏览: 71
C++观察者模式可以用于实现消息机制,以下是一个简单的实现示例:
首先,定义一个消息类型枚举:
```
enum class MessageType {
MSG_TYPE_A,
MSG_TYPE_B,
MSG_TYPE_C
};
```
然后,定义一个消息类,用于封装消息参数:
```
class Message {
public:
Message(MessageType type, void* data) : m_type(type), m_data(data) {}
MessageType getType() const { return m_type; }
void* getData() const { return m_data; }
private:
MessageType m_type;
void* m_data;
};
```
接下来,定义一个观察者接口,包含一个响应消息的方法:
```
class Observer {
public:
virtual void onMessage(const Message& msg) = 0;
};
```
然后,定义一个被观察者类,用于管理观察者并发送消息:
```
class Subject {
public:
void addObserver(Observer* observer) {
m_observers.push_back(observer);
}
void removeObserver(Observer* observer) {
m_observers.erase(std::remove(m_observers.begin(), m_observers.end(), observer), m_observers.end());
}
void sendMessage(const Message& msg) {
for (auto observer : m_observers) {
observer->onMessage(msg);
}
}
private:
std::vector<Observer*> m_observers;
};
```
最后,定义一个具体的观察者类,实现响应消息的方法:
```
class ConcreteObserver : public Observer {
public:
void onMessage(const Message& msg) override {
if (msg.getType() == MessageType::MSG_TYPE_A) {
// 处理 MSG_TYPE_A 类型的消息
void* data = msg.getData();
// ...
}
else if (msg.getType() == MessageType::MSG_TYPE_B) {
// 处理 MSG_TYPE_B 类型的消息
void* data = msg.getData();
// ...
}
else if (msg.getType() == MessageType::MSG_TYPE_C) {
// 处理 MSG_TYPE_C 类型的消息
void* data = msg.getData();
// ...
}
}
};
```
使用时,可以先创建一个被观察者对象和多个观察者对象,然后将观察者注册到被观察者中,并使用被观察者发送消息:
```
int main() {
Subject subject;
ConcreteObserver observer1, observer2;
subject.addObserver(&observer1);
subject.addObserver(&observer2);
// 发送消息
int data = 123;
Message msg(MessageType::MSG_TYPE_A, &data);
subject.sendMessage(msg);
subject.removeObserver(&observer1);
subject.removeObserver(&observer2);
return 0;
}
```
这样就可以通过观察者模式实现简单的消息机制了。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)