观察者模式意图解决一对多的依赖关系情形中,当被依赖对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新的问题。举个很简单的例子说,假如一个游戏中的角色的某个属性状态发生了变化,此处不妨假设为角色的等级升级了,则相应的在游戏场景中的模型展现([依赖点1])需要跟着调整,并且在UI界面上的角色属性([依赖点2])描述细节中还需要及时更新成新等级值展现给玩家。这边的[依赖点1]与[依赖点2]就依赖于角色的属性,并且对于这两个依赖点来说,属性对它们都是很敏感的,它们需要能够及时感知到这些属性的变动。这种情形下就可考虑使用Observer模式。模式的类关系结构图参考如下:

【行为型】Observer模式

    模式的编码结构参考如下:

 1 namespace observer
 2 {
 3     // -------- observer --------
 4     class Subject;
 5     class IObserver
 6     {
 7     public:
 8         // some code here........
 9         virtual void update(Subject* pSubject) = 0;
10 
11     };//class IObserver
12 
13     class ConcreteObserver1 : public IObserver
14     {
15     public:
16         // some code here........
17         virtual void update(Subject* pSubject) override {
18             // some code here........
19             const auto& theState = pSubject->getState();
20             // some other code here........
21         }
22 
23     };//class ConcreteObserver1
24 
25     // -------- subject --------
26     class Subject
27     {
28     public:
29         // some code here........
30         virtual void registeObserver(IObserver* pObserver) = 0;
31         virtual void unregisterObserver(IObserver* pObserver) = 0;
32         virtual void notify() = 0;
33 
34     };//class Subject
35 
36     class ConcreteSubject : public Subject
37     {
38     public:
39         // some code here........
40         virtual void registeObserver(IObserver* pObserver) override {
41             // some code here........
42             m_listObservers.push_back(pObserver);
43         }
44 
45         virtual void unregisterObserver(IObserver* pObserver) override {
46             // some code here........
47             auto iter = std::find(m_listObservers.begin(), m_listObservers.end(), pObserver);
48             if (iter != m_listObservers.end()) {
49                 m_listObservers.erase(iter);
50             }
51         }
52 
53         virtual void notify() override {
54             for_each(m_listObservers.begin(), m_listObservers.end(), [](const IObserver* pObj){ pObj->update(this); });
55         }
56 
57     private:
58         std::list<IObserver*>   m_listObservers;
59 
60     };//class ConcreteSubject
61 
62 }//namespace observer
Observer模式编码结构参考

相关文章:

  • 2021-11-11
  • 2021-06-25
  • 2021-11-30
  • 2021-09-01
  • 2021-06-03
  • 2022-12-23
  • 2021-12-08
  • 2021-10-05
猜你喜欢
  • 2021-07-04
  • 2021-11-22
  • 2021-08-24
  • 2021-04-13
  • 2022-02-02
  • 2021-07-26
相关资源
相似解决方案