在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
观察者模式在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。 再说说上面的数据和图之间的关系;不管是折线图、饼状图,还是柱状图,它们都依赖于数据;当数据发生变化时,数据对象会通知依赖于它的对象去更新;所以就有了Excel中,当数据发生变化时,对应的统计图也会自动的重绘。 UML类图Subject(目标) Observer(观察者) ConcreteSubject(具体目标) ConcreteObserver(具体观察者) 观察者模式按照以下方式进行协作:
以下是调用时序图:
使用场合在以下任一情况下都可以使用观察者模式:
代码实现1 #include <iostream> 2 #include <list> 3 using namespace std; 4 5 class Observer 6 { 7 public: 8 virtual void Update(int) = 0; 9 }; 10 11 class Subject 12 { 13 public: 14 virtual void Attach(Observer *) = 0; 15 virtual void Detach(Observer *) = 0; 16 virtual void Notify() = 0; 17 }; 18 19 class ConcreteObserver : public Observer 20 { 21 public: 22 ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){} 23 24 void Update(int value) 25 { 26 cout<<"ConcreteObserver get the update. New State:"<<value<<endl; 27 } 28 29 private: 30 Subject *m_pSubject; 31 }; 32 33 class ConcreteObserver2 : public Observer 34 { 35 public: 36 ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){} 37 38 void Update(int value) 39 { 40 cout<<"ConcreteObserver2 get the update. New State:"<<value<<endl; 41 } 42 43 private: 44 Subject *m_pSubject; 45 }; 46 47 class ConcreteSubject : public Subject 48 { 49 public: 50 void Attach(Observer *pObserver); 51 void Detach(Observer *pObserver); 52 void Notify(); 53 54 void SetState(int state) 55 { 56 m_iState = state; 57 } 58 59 private: 60 std::list<Observer *> m_ObserverList; 61 int m_iState; 62 }; 63 64 void ConcreteSubject::Attach(Observer *pObserver) 65 { 66 m_ObserverList.push_back(pObserver); 67 } 68 69 void ConcreteSubject::Detach(Observer *pObserver) 70 { 71 m_ObserverList.remove(pObserver); 72 } 73 74 void ConcreteSubject::Notify() 75 { 76 std::list<Observer *>::iterator it = m_ObserverList.begin(); 77 while (it != m_ObserverList.end()) 78 { 79 (*it)->Update(m_iState); 80 ++it; 81 } 82 } 83 84 int main() 85 { 86 // Create Subject 87 ConcreteSubject *pSubject = new ConcreteSubject(); 88 89 // Create Observer 90 Observer *pObserver = new ConcreteObserver(pSubject); 91 Observer *pObserver2 = new ConcreteObserver2(pSubject); 92 93 // Change the state 94 pSubject->SetState(2); 95 96 // Register the observer 97 pSubject->Attach(pObserver); 98 pSubject->Attach(pObserver2); 99 100 pSubject->Notify(); 101 102 // Unregister the observer 103 pSubject->Detach(pObserver); 104 105 pSubject->SetState(3); 106 pSubject->Notify(); 107 108 delete pObserver; 109 delete pObserver2; 110 delete pSubject; 111 }
总结观察者模式在23个设计模式中的地位是非常高的,我们基本上各大框架中都是随处可见。真正的理解了整个模式,对我们去理解别人的代码有非常大的帮助;在我们日后的工作中也会或多或少的使用该设计模式。这里总结的不是很全面,在日后如果碰到了需要补充的内容,我会继续补充的;同时也希望大家提出更好的建议。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论