二十三种设计模式(三)的简单实现之观察者模式(Observer Pattern)

观察者模式用于一对多的情况,当观察对象发生变化时,会通知所有观察者,在实际中应用非常广泛,但是会增加类间的耦合性,使用前需考虑慎重。

观察者虚接口:

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 }

猜你喜欢

转载自www.cnblogs.com/LiQuid/p/10639826.html