首页 > 代码库 > 观察者模式

观察者模式

观察者模式的UML图如下:

技术分享

 

这里使用了依赖倒置原则,依赖于抽象,不能依赖于具体实现。底层不能依赖高层。高层是抽象接口,且是相对稳定的。

 

技术分享
 1 // ConsoleApplication43.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <vector>
 6 #include <algorithm>
 7 #include <iostream>
 8 
 9 using namespace std;
10 
11 class Observer
12 {
13 public:
14     virtual void update(int) = 0;
15 };
16 
17 class Subject
18 {
19 public:
20     void attach(Observer*);
21     void detach(Observer*);
22     void notify();
23     virtual void setState(int)=0;
24     virtual int getState()=0;
25 private:
26     vector<Observer*> vect;
27 protected:
28     int state;
29 };
30 
31 void Subject::attach(Observer* observer)
32 {
33     vect.push_back(observer);
34 }
35 
36 void Subject::detach(Observer* observer)
37 {
38     vector<Observer*>::iterator ite = find(vect.begin(),vect.end(),observer);
39     vect.erase(ite);
40 }
41 
42 void Subject::notify()
43 {
44     vector<Observer*>::iterator begin = vect.begin();
45     while (begin != vect.end())
46     {
47         (*begin)->update(state);
48         ++begin;
49     }
50 }
51 
52 class ConcreteObserver :public Observer
53 {
54     void update(int);
55 };
56 
57 void ConcreteObserver::update(int state)
58 {
59     cout << this << " --->ConcreteObserver---------->" << state << endl;
60 }
61 
62 class ConcreteSubject:public Subject
63 {
64     void setState(int);
65     int getState();
66 };
67 
68 void ConcreteSubject::setState(int st)
69 {
70     state = st;
71 }
72 
73 int ConcreteSubject::getState()
74 {
75     return state;
76 }
77 
78 
79 int main()
80 {
81     Subject *subject = new ConcreteSubject();
82     Observer *ob1 = new ConcreteObserver();
83     Observer *ob2 = new ConcreteObserver();
84     subject->attach(ob1);
85     subject->attach(ob2);
86     subject->setState(1);
87     subject->notify();
88     delete ob1;
89     delete ob2;
90     delete subject;
91     system("pause");
92     return 0;
93 }
View Code

 

观察者模式