定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 观察者模式又叫做发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听器(Source-Listener)模式。
实现一个抽象观察者和抽象主题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Observer : public std::enable_shared_from_this<Observer>{ public : virtual ~Observer () {} virtual void update (int ) = 0 ; }; class Subject { public : virtual ~Subject () {} virtual void attach (std::weak_ptr<Observer>) = 0 ; virtual void detach (std::weak_ptr<Observer>) = 0 ; virtual void notify () = 0 ; };
具体实现 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 class PhoneObserver : public Observer{ public : virtual void update (int i) { std::cout << "This is PhoneObserver " << i << std::endl; } }; class ComputerObserver : public Observer{ public : virtual void update (int i) { std::cout << "This is ComputerObserver " << i << std::endl; } }; class ConcreteSubject : public Subject{ public : virtual void attach (std::weak_ptr<Observer> observerPtr) { m_Observers.push_back (observerPtr); } virtual void detach (std::weak_ptr<Observer> observerPtr) { m_Observers.remove_if ( [=](const std::weak_ptr<Observer> &ptr1) { return observerPtr.lock () == ptr1.lock (); }); } virtual void notify () { for (auto iter = m_Observers.begin (); iter != m_Observers.end ();) { auto share = (*iter).lock (); if (share) { share->update (m_state); iter++; } else { iter = m_Observers.erase (iter); } } } void setState (int state) { m_state = state; } private : std::list<std::weak_ptr<Observer>> m_Observers; int m_state = 0 ; };
测试 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 int main (int argc, char *argv[]) { auto phoneObserver = std::make_shared <PhoneObserver>(); auto computerObserver = std::make_shared <ComputerObserver>(); auto concreteSubject = std::make_unique <ConcreteSubject>(); concreteSubject->attach (phoneObserver); concreteSubject->attach (computerObserver); concreteSubject->setState (1 ); concreteSubject->notify (); std::cout << "----------------------------" << std::endl; concreteSubject->detach (computerObserver); concreteSubject->setState (222 ); concreteSubject->notify (); std::cout << "----------------------------" << std::endl; concreteSubject->attach (computerObserver); concreteSubject->detach (phoneObserver); concreteSubject->setState (333 ); concreteSubject->notify (); std::cout << "----------------------------" << std::endl; concreteSubject->attach (phoneObserver); concreteSubject->setState (444 ); concreteSubject->notify (); std::cout << "----------------------------" << std::endl; phoneObserver.reset (); computerObserver.reset (); concreteSubject->setState (555 ); concreteSubject->notify (); return 0 ; }
结果 1 2 3 4 5 6 7 8 9 10 This is PhoneObserver 1 This is ComputerObserver 1 ---------------------------- This is PhoneObserver 222 ---------------------------- This is ComputerObserver 333 ---------------------------- This is ComputerObserver 444 This is PhoneObserver 444 ----------------------------