

1 #include <iostream>
2 #include <vector>
3 #include <algorithm>
4 #include <iterator>
5 #include <string>
6
7 using namespace std;
8
9 class STSubject;
10
11 //观察者
12 class STObserver
13 {
14 public:
15 virtual void Update() = 0;
16 };
17
18 class STConcreteObserverA: public STObserver
19 {
20 public:
21 virtual void Update()
22 {
23 cout<< "ConcreteObserverA Get Subject: "<< endl;
24 }
25 };
26
27 class STConcreteObserverB: public STObserver
28 {
29 public:
30 virtual void Update()
31 {
32 cout<< "ConcreteObserverB Get Subject: "<< endl;
33 }
34 };
35
36
37 //目标
38 class STSubject
39 {
40 public:
41 void Attach(STObserver* pstObserver)
42 {
43 m_vecObj.push_back(pstObserver);
44 }
45 void Detach(STObserver* pstObserver)
46 {
47 typeof(m_vecObj.begin()) it = find(m_vecObj.begin(), m_vecObj.end(), pstObserver);
48 if (it != m_vecObj.end())
49 m_vecObj.erase(it);
50 }
51 void Notify()
52 {
53 for (size_t i = 0; i < m_vecObj.size(); i++)
54 {
55 m_vecObj[i]->Update();
56 }
57 }
58
59 virtual string GetName() = 0;
60
61 private:
62 vector<STObserver*> m_vecObj;
63 };
64
65 class STConcreteSubjectA: public STSubject
66 {
67 public:
68 virtual string GetName()
69 {
70 return "ConcreteSubjectA";
71 }
72
73 };
74
75 int main(int argc, char* argv[])
76 {
77 STSubject* pstSubjectA = new STConcreteSubjectA();
78 STObserver* pstObserverA = new STConcreteObserverA();
79 STObserver* pstObserverB = new STConcreteObserverB();
80
81 pstSubjectA->Attach(pstObserverA);
82 pstSubjectA->Attach(pstObserverB);
83
84 pstSubjectA->Notify();
85
86 pstSubjectA->Detach(pstObserverB);
87 pstSubjectA->Notify();
88
89 return 0;
90 }
91 //////////////////////////////////
92 [root@ ~/learn_code/design_pattern/12_observer]$ ./observer
93 ConcreteObserverA Get Subject:
94 ConcreteObserverB Get Subject:
95 ConcreteObserverA Get Subject: