有个报社,在有新报纸的时候,会给所有的订阅者发送推送。
1 ///
2 /// @file Observer.h
3 /// @author marrs(chenchengxi993@gmail.com)
4 /// @date 2017-08-20 19:54:38
5 ///
6
7 #ifndef __OBSERVER_H__
8 #define __OBSERVER_H__
9
10 #include <iostream>
11
12 namespace marrs{
13
14 using std::cout;
15 using std::endl;
16 using std::string;
17
18 class Observer
19 {
20 public:
21 virtual ~Observer(){}
22 public:
23 virtual void Update(string & str_message) = 0;
24 public:
25 virtual string GetName() = 0;
26 virtual string GetMsg() = 0;
27 protected:
28 string _str_name;
29 string _str_message;
30 };
31
32 }
33
34 #endif // __OBSERVER_H__
1 ///
2 /// @file Observerable.h
3 /// @author marrs(chenchengxi993@gmail.com)
4 /// @date 2017-08-20 19:48:42
5 ///
6
7 #ifndef __OBSERVERABLE_H__
8 #define __OBSERVERABLE_H__
9
10 #include <iostream>
11 #include <vector>
12
13 namespace marrs{
14
15 using std::cout;
16 using std::endl;
17 using std::string;
18 using std::vector;
19
20 class Observer;
21 typedef vector<Observer *> ObserverCache;
22
23 class Observerable
24 {
25 public:
26 virtual ~Observerable(){}
27
28 public:
29 virtual void AddObserver(Observer * observer) = 0;
30 virtual void DelObserver(Observer * observer) = 0;
31 virtual void NotifyObserver(string str_message) = 0;
32 protected:
33 ObserverCache _observer;
34 };
35
36 }
37
38 #endif // __OBSERVERABLE_H__
1 ///
2 /// @file NewspaperOffice.h
3 /// @author marrs(chenchengxi993@gmail.com)
4 /// @date 2017-08-20 20:07:02
5 ///
6
7 #ifndef __NEWSPAPEROFFICE_H__
8 #define __NEWSPAPEROFFICE_H__
9
10 #include "Observerable.h"
11
12 namespace marrs{
13
14 class NewspaperOffice
15 : public Observerable
16 {
17 public:
18 void AddObserver(Observer * observer);
19 void DelObserver(Observer * observer);
20 void NotifyObserver(string str_message);
21 };
22
23 }
24
25 #endif // __NEWSPAPEROFFICE_H__
1 ///
2 /// @file NewspaperOffice.cc
3 /// @author marrs(chenchengxi993@gmail.com)
4 /// @date 2017-08-20 20:19:15
5 ///
6
7 #include "NewspaperOffice.h"
8 #include "Observer.h"
9 #include <algorithm>
10
11 namespace marrs{
12
13 void NewspaperOffice::AddObserver(Observer * observer)
14 {
15 cout << "add a new Reader" << endl;
16 cout << "name : " << observer->GetName() << endl;
17 _observer.push_back(observer);
18 }
19
20 void NewspaperOffice::DelObserver(Observer * observer)
21 {
22 cout << "del a Reader" << endl;
23 cout << "name : " << observer->GetName() << endl;
24 _observer.erase(remove(_observer.begin(), _observer.end(), observer));
25 }
26
27 void NewspaperOffice::NotifyObserver(string str_message)
28 {
29 ObserverCache::iterator it_Observer;
30 it_Observer = _observer.begin();
31 for(; it_Observer != _observer.end(); ++it_Observer)
32 {
33 (*it_Observer)->Update(str_message);
34 }
35 }
36
37 }
1 ///
2 /// @file Readers.h
3 /// @author marrs(chenchengxi993@gmail.com)
4 /// @date 2017-08-20 20:43:46
5 ///
6
7 #ifndef __READERS_H__
8 #define __READERS_H__
9
10 #include "Observer.h"
11
12 namespace marrs{
13
14 class Readers
15 : public Observer
16 {
17 public:
18 Readers(string str_name);
19 public:
2