Observer Pattern

公众号与订阅者之间的关系,一对多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Observer
class Observer
{
public:
Observer() = default;
virtual ~Observer() = default;

virtual void update(const char *msg) = 0;
};

class Subscriber : public Observer
{
public:
explicit Subscriber(const std::string &id) {}
~Subscriber() override {}

void update(const std::string &msg) override
{
// recived a new message
}

private:
std::string m_id;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Subject
class Observer;
class Subject
{
public:
Subject() = default;
virtual ~Subject() = default;

virtual void notify() = 0;
virtual void registerObserver(Observer *) = 0;
virtual void unregisterObserver(Observer *) = 0;
};
class Service : public Subject
{
public:
Service() {}
~Service() override {}

void notify() override
{
for (Observer *obs : m_observers) {
obs->update("Hello!");
}
}
void registerObserver(Observer *observer) override
{
m_observers.emplace_back(observer);
observer->update("Subscribe successfully!");
}
void unregisterObserver(Observer *observer) override;
{
m_observers.remove(observer);
observer->update("Unsubscribe successfully!");
}

protected:
std::list<Observer *> m_observers;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// main
#include "observer.h"
#include "subject.h"

int main(int argc, char *argv[])
{
Service service;
Subscriber subscriberA("Subscriber A");
Subscriber subscriberB("Subscriber B");
Subscriber subscriberC("Subscriber C");

service.registerObserver(&subscriberA);
service.registerObserver(&subscriberB);
service.registerObserver(&subscriberC);
service.notify();

service.unregisterObserver(&subscriberC);
service.notify();

return 0;
}

Observer Pattern
https://laplac2.github.io/design-pattern/observer/
作者
Laplace
发布于
2023年12月9日
许可协议