Design Pattern --- Observer

Intent:
    Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

Examples:
   auctor, bidders and the bid
   soccer players, referee and the soccer
   temperature/pressure and the monitors
   data and the views

Structure:


示例:
温度和压力监测器需要实时更新数据通知显示器,显示器是电脑上的GUI图形窗口,和现场液晶大屏幕。压力和温度就是Subject,电脑和大屏幕是Observer。


C++ Code:

 1#ifndef SUBJECT_H
 2#define SUBJECT_H
 3#include <vector>
 4#include "Observer.h"
 5using namespace std;
 6
 7typedef int state;
 8
 9class Subject
10{
11    public:
12        Subject() {}
13        virtual ~Subject() {}
14
15        void attach(Observer * observer) {
16            m_observers.push_back(observer);
17        }
18
19        void notify() {
20            vector< Observer *>::const_iterator it;
21            for(it = m_observers.begin(); it != m_observers.end(); ++it)
22                (*it)->Update(this);
23        }
24
25        virtual void stateChanged(state s) = 0;
26        virtual void getState()=0;
27    private:
28        vector<Observer *> m_observers;
29};
30
31#endif


 1#ifndef TEMPERATURE_H
 2#define TEMPERATURE_H
 3#include <iostream>
 4#include "Subject.h"
 5using namespace std;
 6
 7class Temperature : public Subject
 8{
 9 public:
10        Temperature(state s=0) {m_s = s;}
11        ~Temperature() {}
12        
13        void stateChanged(state s) {
14             cout<<"Temperature changed"<<endl;
15             m_s = s;
16             notify();
17             }
18             
19        void getState() {
20             getTemperature();
21             }
22        void getTemperature() {
23             cout<<"Current temperature is "<<m_s<<"°"<<endl;
24             } 
25 private:
26     state m_s;
27};
28
29#endif
30

 1#ifndef OBSERVER_H
 2#define OBSERVER_H
 3
 4class Subject;
 5
 6class Observer
 7{
 8    public:
 9        Observer() {}
10        virtual ~Observer() {}
11
12        virtual void Update(Subject * subject) = 0;
13};
14
15#endif

 1#ifndef ENVIRONMENTWINDOW_H
 2#define ENVIRONMENTWINDOW_H
 3#include <iostream>
 4#include "Observer.h"
 5
 6class Subject;
 7
 8class EnvironmentWindow : public Observer
 9{
10  public:
11         EnvironmentWindow() {}
12         ~EnvironmentWindow() {}
13         
14         void Update(Subject * subject)
15         {
16                 subject->getState();
17         }    
18};
19
20#endif
21


16#include "Subject.h"
17#include "Observer.h"
18#include "Temperature.h"
19#include "EnvironmentWindow.h"
20
21
22int main(int argc, char *argv[])
23{
24    Subject * temp = new Temperature();
25    Observer * observer = new EnvironmentWindow();
26    
27    temp->attach(observer);
28    temp->stateChanged(10);
29    temp->stateChanged(20);
30    temp->stateChanged(35);
31
32    system("PAUSE");
33    return EXIT_SUCCESS;
34}
35

posted on 2010-08-01 20:29 挑灯看剑 阅读(263) 评论(0)  编辑 收藏 引用 所属分类: 架构设计/设计模式

只有注册用户登录后才能发表评论。
<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

公告

【自我介绍】 08年南开大学硕士毕业 最近关注:算法、Linux、c++、高并发 爱好:滑旱冰、打乒乓球、台球、保龄球

常用链接

随笔分类(139)

文章分类

我常去的网站

技术博客(都是大牛)

技术站点

搜索

积分与排名