posts - 11,comments - 13,trackbacks - 0
observer推拉模式的区别请参考上一篇observer推模式
拉模式源代码如下:
 1#ifndef __SUBJECT_H__
 2#define __SUBJECT_H__
 3
 4#include <iostream>
 5#include <vector>
 6
 7class CObserver;
 8
 9typedef struct _INFO_
10{
11    std::string m_desc;
12    std::string m_temp;
13    _INFO_()
14    {
15        m_desc = "Description!";
16        m_temp = "Temperature";
17    }

18}
INFO;
19
20class CSubject
21{
22protected:
23    CSubject()
24    {
25        _obs = NULL;
26        _obs = new std::vector<CObserver *>;
27    }

28
29public:
30    virtual ~CSubject()
31    {
32        if(!(*_obs).empty())
33        {
34            (*_obs).clear();
35        }

36        delete(_obs);
37        _obs = NULL;
38    }

39    virtual void AddObserver(CObserver * );
40    virtual void DelObserver(CObserver *);
41    virtual void Update( );
42    virtual void Set_info(std::string ,std::string= 0;
43    virtual std::string Get_Desc() = 0;
44    virtual std::string Get_Temp() = 0;
45    virtual INFO Get_info() = 0;
46public:
47    std::vector<CObserver *> *_obs;
48}
;
49
50class CExtendSubject:public CSubject
51{
52public:
53    CExtendSubject()
54    {
55
56    }

57    ~CExtendSubject()
58    {
59
60    }

61    void Set_info(std::string ,std::string);
62    std::string Get_Desc();
63    std::string Get_Temp();
64    INFO Get_info();
65public:
66    INFO m_info;
67}
;
68#endif
 1#ifndef __OBSERVER_H__
 2#define __OBSERVER_H__
 3#include "Subject.h"
 4
 5class CObserver
 6{
 7protected:
 8    CObserver()
 9    {
10
11    }

12public:
13    virtual ~CObserver()
14    {
15
16    }

17
18    //virtual void Update(CSubject *) = 0;
19    virtual void GetMsg() = 0;
20    virtual void PrintMsg( const char *= 0;
21
22}
;
23
24class CExtendObserver:public CObserver
25{
26public:
27    CExtendObserver(CSubject *data)
28    {
29        _sub = data;
30        _sub->AddObserver(this);
31    }

32
33    ~CExtendObserver()
34    {
35        _sub->DelObserver(this);
36        if (_sub != 0
37        
38            delete _sub; 
39            _sub = NULL;
40        }

41    }

42    void GetMsg();
43    void PrintMsg( const char * );
44private:
45    CSubject * _sub;
46}
;
47
48class CExtendObserver1:public CObserver
49{
50public:
51    CExtendObserver1(CSubject * data)
52    {
53        _sub = data;
54        _sub->AddObserver(this);
55    }

56    ~CExtendObserver1()
57    {
58        _sub->DelObserver(this);
59        if (_sub != 0
60        
61            delete _sub; 
62            _sub = NULL;
63        }

64    }

65    void GetMsg();
66    void PrintMsg( const char *);
67private:
68    CSubject * _sub;
69}
;
70
71
72class CExtendObserver2:public CObserver
73{
74public:
75    CExtendObserver2(CSubject * data)
76    {
77        _sub = data;
78        _sub->AddObserver(this);
79    }

80    ~CExtendObserver2()
81    {
82        _sub->DelObserver(this);
83        if (_sub != 0
84        
85            delete _sub; 
86            _sub = NULL;
87        }

88    }

89    void GetMsg();
90    void PrintMsg( const char *);
91private:
92    CSubject * _sub;
93}
;
94
95#endif
 1#include "Subject.h"
 2#include <algorithm>
 3#include "observer.h"
 4void CSubject::AddObserver(CObserver * data)
 5{
 6    (*_obs).push_back(data);
 7}

 8
 9void CSubject::DelObserver(CObserver * data)
10{
11    if(!data)
12    {
13        (*_obs).erase(remove((*_obs).begin(),(*_obs).end(),data));
14    }

15}

16
17void CSubject::Update()
18{
19    /*std::vector<CObserver*>::iterator iter = (*_obs).begin();
20    for(;iter != (*_obs).end();++iter)
21    {
22        CObserver* tmp = (*iter);
23        tmp->Update(this);
24    }*/

25}

26
27void CExtendSubject::Set_info(std::string desc,std::string temp)
28{
29    if(!m_info.m_desc.empty())
30    {
31        m_info.m_desc.clear();
32    }

33
34    if(!m_info.m_temp.empty())
35    {
36        m_info.m_temp.clear();
37    }

38
39    m_info.m_temp = temp;
40    m_info.m_desc = desc;
41}

42
43
44INFO CExtendSubject::Get_info()
45{
46    return m_info;
47}

48
49std::string CExtendSubject::Get_Desc()
50{
51    return m_info.m_desc;
52}

53
54std::string CExtendSubject::Get_Temp()
55{
56    return m_info.m_temp;
57}
 1#include "observer.h"
 2
 3void CExtendObserver1::GetMsg()
 4{
 5    //得到温度
 6    std::string temp = /*data*/_sub->Get_Temp();
 7    PrintMsg(temp.c_str());
 8}

 9
10void CExtendObserver1::PrintMsg( const char * str)
11{
12    std::cout<<"**********************"<<std::endl;
13    std::cout<<"CExtendObserver1:"<<str<<std::endl;
14    std::cout<<"**********************"<<std::endl;
15}

16
17
18void CExtendObserver::GetMsg()
19{
20    std::string temp = /*data*/_sub->Get_Desc();
21    PrintMsg(temp.c_str());
22}

23
24void CExtendObserver::PrintMsg( const char * str)
25{
26    std::cout<<"**********************"<<std::endl;
27    std::cout<<"CExtendObserver:"<<str<<std::endl;
28    std::cout<<"**********************"<<std::endl;
29}

30
31
32void CExtendObserver2::GetMsg()
33{
34    INFO temp = /*data*/_sub->Get_info();
35    std::string sstr = temp.m_desc;
36    sstr += ",";
37    sstr += temp.m_temp;
38    PrintMsg(sstr.c_str());
39}

40
41void CExtendObserver2::PrintMsg( const char * str)
42{
43    std::cout<<"**********************"<<std::endl;
44    std::cout<<"CExtendObserver2:"<<str<<std::endl;
45    std::cout<<"**********************"<<std::endl;
46}

47
48int main(int argc,char * argv[])
49{
50    CSubject * sub = new CExtendSubject();
51    CObserver* ob1 = new CExtendObserver(sub);
52    CObserver * ob2 = new CExtendObserver1(sub);
53    CObserver * ob3 = new CExtendObserver2(sub);
54    ob1->GetMsg();
55    ob2->GetMsg();
56    ob3->GetMsg();
57    std::cout<<"#######################"<<std::endl;
58    std::cout<<"#######################"<<std::endl;
59
60    sub->Set_info("Change Desc!","Change Temperature!");
61
62    ob1->GetMsg();
63    ob2->GetMsg();
64    ob3->GetMsg();
65}
posted on 2009-06-18 19:27 Super- 阅读(1187) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理