当一个对象状态发生变化时,如果多个对象希望感知这种变化,那么我们应该把这多个对象提出一个抽象基类,提供一个统一的接收变化的接口

类比现实中,很多网站有订阅消息的功能,当你同意订阅他们的消息,他们即会在合适的时候向所有订阅者包括你,发布消息

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <string>
#include <unordered_set>

class observer {
public:
virtual void GetMsg(std::string msg) = 0;
virtual ~observer() {}
};

class Publiser {
public:
void addSub(observer* obs) {
m_obss.insert(obs);
}

void unSub(observer* obs) {
if(m_obss.count(obs)) {
m_obss.erase(obs);
}
}

void PubMsg(std::string msg) {
for(auto &item : m_obss) {
item->GetMsg(msg);
}
}
private:
std::unordered_set<observer*> m_obss;
};

class MailSuber : public observer {
public:
MailSuber(std::string mail) : m_mail(mail) {}
void GetMsg(std::string msg) override {
std::cout << "[" << m_mail << "]: " << msg << std::endl;
}
private:
std::string m_mail;
};

class PhoneSuber : public observer {
public:
PhoneSuber(std::string phone) : m_phone(phone) {}
void GetMsg(std::string msg) override {
std::cout << "[" << m_phone << "]: " << msg << std::endl;
}
private:
std::string m_phone;
};

int main() {
Publiser pub;

observer* o1 = new MailSuber("10001@126.com");
observer* o2 = new MailSuber("88888@qq.com");
observer* o3 = new MailSuber("abc@yahoo.com");
observer* o4 = new PhoneSuber("+1 100 888 9999");
observer* o5 = new PhoneSuber("+86 18888888888");

pub.addSub(o1);
pub.addSub(o2);
pub.addSub(o3);
pub.addSub(o4);
pub.addSub(o5);

pub.PubMsg("黑色星期5, 50%off");
pub.unSub(o1);
pub.unSub(o4);
std::cout << "==========================" << std::endl;
pub.PubMsg("非常抱歉,我们的服务将于2028/01/01停止");

delete o1;
delete o2;
delete o3;
delete o4;
delete o5;
return 0;
}