设计模式实现(一)——观察者模式的C++实现
一、观察者模式的应用场景
当对象间存在一对多关系时,则使用观察者模式。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
二、观察者模式的设计图解

三、代码详解
1 #include "pch.h" 2 #include <iostream> 3 #include <list> 4 #include <string> 5 using namespace std; 6 class IObserver; 7 8 class ISubject { 9 private: 10 list<IObserver*> observerList; 11 public: 12 int state; 13 public: 14 void AddObserver(IObserver *obs); 15 void RemoveObserver(IObserver *obs); 16 virtual void Notified(IObserver*) = 0; 17 virtual void SetState(int value) = 0; 18 void Update() { 19 for (auto ob : observerList) { 20 if (ob != NULL) { 21 Notified(ob); 22 } 23 } 24 } 25 }; 26 27 void ISubject::AddObserver(IObserver *obs) { 28 observerList.push_back(obs); 29 } 30 31 void ISubject::RemoveObserver(IObserver *obs) { 32 observerList.remove(obs); 33 } 34 35 class IObserver { 36 public: 37 virtual void Received(ISubject*) = 0; 38 }; 39 40 class Subject : public ISubject { 41 public: 42 Subject() :ISubject(){} 43 void Notified(IObserver *obs) { 44 obs->Received(this); 45 } 46 void SetState(int value) override { 47 state = value; 48 } 49 }; 50 51 class Observer : public IObserver { 52 public: 53 Observer(const string &n) { 54 name = n; 55 } 56 void Received(ISubject *sub) { 57 value = sub->state; 58 cout << "this is " + name + " OBer, Received value = "<< value << endl; 59 } 60 private: 61 string name; 62 int value; 63 }; 64 65 int main() 66 { 67 Subject subObj; 68 Observer* observer1 = new Observer("xiaoming"); 69 Observer* observer2 = new Observer("xiaohong"); 70 subObj.AddObserver(observer1); 71 subObj.AddObserver(observer2); 72 subObj.SetState(100); 73 subObj.Update(); 74 system("pause"); 75 return 0; 76 }
运行结果:

四、观察者和发布订阅模式的区别

- 观察者模式中的发布者和观察者之间互相知道对方存在,是强耦合关系。
- 发布-订阅模式是松耦合关系,互相不知道对方的存在。不需要彼此了解,他们只是在消息队列或代理的帮助下进行通信。
- 观察者模式以同步方式发生,发布-订阅模式大多情况下以异步方式发生(使用消息队列)
- 观察者模式需要在单个应用程序地址空间中实现。另一方面,发布者/订阅者模式更像是跨应用程序模式。
浙公网安备 33010602011771号