当一个对象状态发生变化时,如果多个对象希望感知这种变化,那么我们应该把这多个对象提出一个抽象基类,提供一个统一的接收变化的接口
类比现实中,很多网站有订阅消息的功能,当你同意订阅他们的消息,他们即会在合适的时候向所有订阅者包括你,发布消息
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; }
|