观察者模式用于一对多的情况,当观察对象发生变化时,会通知所有观察者,在实际中应用非常广泛,但是会增加类间的耦合性,使用前需考虑慎重。
观察者虚接口:
1 #pragma once 2 class CObserver 3 { 4 public: 5 CObserver(); 6 virtual ~CObserver(); 7 8 virtual void Update() = 0; 9 };
1 #include "pch.h" 2 #include "Observer.h" 3 4 CObserver::CObserver() 5 { 6 } 7 8 CObserver::~CObserver() 9 { 10 }
实际观察者:
1 #pragma once 2 #include "Observer.h" 3 #include <string> 4 5 class CConcreteObser : 6 public CObserver 7 { 8 public: 9 CConcreteObser(); 10 virtual ~CConcreteObser(); 11 12 virtual void Update(); 13 };
1 #include "pch.h" 2 #include "ConcreteObser.h" 3 #include <iostream> 4 5 CConcreteObser::CConcreteObser() 6 { 7 } 8 9 10 CConcreteObser::~CConcreteObser() 11 { 12 } 13 14 void CConcreteObser::Update() 15 { 16 std::cout << "This is Obser 1"<< std::endl; 17 }
被观察者:
1 #pragma once 2 #include <vector> 3 #include "Observer.h" 4 class CSubject: 5 public std::vector<CObserver*> 6 { 7 public: 8 CSubject(); 9 virtual ~CSubject(); 10 11 //附加观察者 12 void AttachObser(CObserver* pObser); 13 //清空观察者 14 void ClearObser(); 15 //通知所有观察者 16 void Notify(); 17 };
1 #include "pch.h" 2 #include "Subject.h" 3 4 5 CSubject::CSubject() 6 { 7 } 8 9 10 CSubject::~CSubject() 11 { 12 } 13 14 void CSubject::AttachObser(CObserver* pObser) 15 { 16 push_back(pObser); 17 } 18 19 void CSubject::ClearObser() 20 { 21 clear(); 22 } 23 24 void CSubject::Notify() 25 { 26 for (int i = 0; i < size();i++) 27 { 28 (this->at(i))->Update(); 29 } 30 }
示例代码:
1 #include "pch.h" 2 #include "ConcreteObser.h" 3 #include "Subject.h" 4 5 int main() 6 { 7 CSubject subj; 8 CConcreteObser obser; 9 subj.AttachObser(&obser); 10 11 //通知观察者 12 subj.Notify(); 13 }
二十三种设计模式(三)的简单实现之观察者模式(Observer Pattern)
原文:https://www.cnblogs.com/LiQuid/p/10639826.html