#include <iostream>
#include <unordered_set>
#include <memory>
using namespace std;
class Observer;
class Subject;
class Subject {
private:
unordered_set<shared_ptr<Observer>> obs;
protected:
char buff[1024]{};
public:
void setBuffer(const char *str) {
snprintf(buff, 1024, "%s", str);
}
void subscribe(const shared_ptr<Observer> &observer);
void unsubscribe(const shared_ptr<Observer> &observer);
void update();
virtual string notify() {
cout << " hello world" << endl;
return "hello world";
}
};
class Observer : public enable_shared_from_this<Observer> {
protected:
shared_ptr<Subject> sub;
Observer() = default;
explicit Observer(const shared_ptr<Subject> &sub) : sub(sub) {}
public:
static shared_ptr<Observer> getInstance(const shared_ptr<Subject> &sub) {
shared_ptr<Observer> ob(new Observer(sub));
return ob->shared_from_this();
}
void update() {
cout << "sub update";
sub->notify();
}
void subscribe() {
sub->subscribe(shared_from_this());
}
void unsubscribe() {
sub->unsubscribe(shared_from_this());
}
};
void Subject::subscribe(const shared_ptr<Observer> &observer) {
obs.insert(observer);
}
void Subject::unsubscribe(const shared_ptr<Observer> &observer) {
obs.erase(observer);
}
void Subject::update() {
for (const auto &ob : obs) {
ob->update();
}
}
class Connection : public Subject {
public:
string notify() override {
cout << buff << endl;
return buff;
}
};
class ConnectObserver : public Observer {
protected:
explicit ConnectObserver(const shared_ptr<Subject> &sub) : Observer(sub) {}
public:
static shared_ptr<Observer> getInstance(const shared_ptr<Subject> &sub) {
shared_ptr<Observer> ob(new ConnectObserver(sub));
return ob->shared_from_this();
}
};
int main() {
shared_ptr<Subject> sub = make_shared<Connection>();
sub->setBuffer(" 12345567");
shared_ptr<Observer> ob = ConnectObserver::getInstance(sub);
ob->subscribe();
sub->update();
ob->unsubscribe();
}
c++-观察者模式的实现
最新推荐文章于 2024-08-12 15:36:46 发布
这篇博客展示了如何在C++中实现观察者模式。通过`Subject`和`Observer`类,创建了一个事件发布和订阅的机制。`Connection`类作为具体的主题,而`ConnectObserver`是观察者,用于接收并处理主题的更新。在`main`函数中,创建了`Connection`实例和`ConnectObserver`实例,并进行了订阅、更新和退订操作。
摘要由CSDN通过智能技术生成