super-
C++博客
首页
新随笔
新文章
联系
聚合
管理
posts - 11,comments - 13,trackbacks - 0
<
2009年6月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔档案
2009年7月 (2)
2009年6月 (9)
搜索
最新评论
1. re: 关于release和debug中vector的疑问
@Super-
3q
--wy
2. re: c++内存池
评论内容较长,点击标题查看
--dissertation writing
3. re: c++内存池
评论内容较长,点击标题查看
--Original essay
4. re: c++内存池
大家一起分享!
--凡客诚品
5. re: c++内存池[未登录]
评论内容较长,点击标题查看
--dd
阅读排行榜
1. 关于release和debug中vector的疑问(3634)
2. linux 创建进程(3271)
3. c++内存池(2670)
4. State设计模式(1384)
5. Observer推模式(1373)
评论排行榜
1. c++内存池(6)
2. State设计模式(2)
3. 关于release和debug中vector的疑问(2)
4. Bridge模式(2)
5. Observer推模式(0)
Observer拉模式
observer推拉模式的区别请参考上一篇observer推模式
拉模式源代码如下:
1
#ifndef __SUBJECT_H__
2
#define
__SUBJECT_H__
3
4
#include
<
iostream
>
5
#include
<
vector
>
6
7
class
CObserver;
8
9
typedef
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
20
class
CSubject
21
{
22
protected
:
23
CSubject()
24
{
25
_obs
=
NULL;
26
_obs
=
new
std::vector
<
CObserver
*>
;
27
}
28
29
public
:
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
;
46
public
:
47
std::vector
<
CObserver
*>
*
_obs;
48
}
;
49
50
class
CExtendSubject:
public
CSubject
51
{
52
public
:
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();
65
public
:
66
INFO m_info;
67
}
;
68
#endif
1
#ifndef __OBSERVER_H__
2
#define
__OBSERVER_H__
3
#include
"
Subject.h
"
4
5
class
CObserver
6
{
7
protected
:
8
CObserver()
9
{
10
11
}
12
public
:
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
24
class
CExtendObserver:
public
CObserver
25
{
26
public
:
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
*
);
44
private
:
45
CSubject
*
_sub;
46
}
;
47
48
class
CExtendObserver1:
public
CObserver
49
{
50
public
:
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
*
);
67
private
:
68
CSubject
*
_sub;
69
}
;
70
71
72
class
CExtendObserver2:
public
CObserver
73
{
74
public
:
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
*
);
91
private
:
92
CSubject
*
_sub;
93
}
;
94
95
#endif
1
#include
"
Subject.h
"
2
#include
<
algorithm
>
3
#include
"
observer.h
"
4
void
CSubject::AddObserver(CObserver
*
data)
5
{
6
(
*
_obs).push_back(data);
7
}
8
9
void
CSubject::DelObserver(CObserver
*
data)
10
{
11
if
(
!
data)
12
{
13
(
*
_obs).erase(remove((
*
_obs).begin(),(
*
_obs).end(),data));
14
}
15
}
16
17
void
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
27
void
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
44
INFO CExtendSubject::Get_info()
45
{
46
return
m_info;
47
}
48
49
std::
string
CExtendSubject::Get_Desc()
50
{
51
return
m_info.m_desc;
52
}
53
54
std::
string
CExtendSubject::Get_Temp()
55
{
56
return
m_info.m_temp;
57
}
1
#include
"
observer.h
"
2
3
void
CExtendObserver1::GetMsg()
4
{
5
//
得到温度
6
std::
string
temp
=
/**/
/*
data
*/
_sub
->
Get_Temp();
7
PrintMsg(temp.c_str());
8
}
9
10
void
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
18
void
CExtendObserver::GetMsg()
19
{
20
std::
string
temp
=
/**/
/*
data
*/
_sub
->
Get_Desc();
21
PrintMsg(temp.c_str());
22
}
23
24
void
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
32
void
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
41
void
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
48
int
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-
阅读(1188)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理