2015-01-28 星期三 21:39:28
1、Event时序图
2、Event Class
3、Event Demo
BasicEventTest.cpp
-
testNoDelegate += --> -= --> notify()
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
|
void
BasicEventTest::testNoDelegate()
{
int
tmp = 0;
EventArgs args;
assert
(_count == 0);
assert
(Void.empty());
Void.notify(
this
);
assert
(_count == 0);
Void += delegate(
this
, &BasicEventTest::onVoid);
assert
(!Void.empty());
Void -= delegate(
this
, &BasicEventTest::onVoid);
assert
(Void.empty());
Void.notify(
this
);
assert
(_count == 0);
assert
(Simple.empty());
Simple.notify(
this
, tmp);
assert
(_count == 0);
Simple += delegate(
this
, &BasicEventTest::onSimple);
assert
(!Simple.empty());
Simple -= delegate(
this
, &BasicEventTest::onSimple);
assert
(Simple.empty());
Simple.notify(
this
, tmp);
assert
(_count == 0);
...................
}
|
-
其他的 testN略过
Event Demo 和 Notifications Demo一样,source和target都是同一个object。
4、Event 分析
-
和Notifications比较
NotificationCenter中callback()携带形参Notification,target知晓的是Notification。
Event中callback()携带形参const void* pSender,target知晓的是pSender。
Event中callback()的形参EventArgs args也可以类似为Notification。
从时序图看,可以认为有如下等同
NotificationCenter == Event(内聚Strategy,Strategy又内聚vector容器)
ObserverN == DelegateN
NotificationCenter和Event都内聚了vector容器。Event更抽象(有Strategy),更解耦(有全局的delegate() 函数)。
它们的实现核心就是内聚了vector容器,通过+=/-=(add/remove)来增删关注者(ObserverN/DelegateN),并在
Notify()中遍历vector iterator来调用关注者的callback()。其实都可以看作是观察者模式的延伸。
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
31
32
33
|
#include "Poco/BasicEvent.h"
#include "Poco/Delegate.h"
#include <iostream>
using
Poco::BasicEvent;
using
Poco::Delegate;
class
Source
{
public
:
BasicEvent<
int
> theEvent;
void
fireEvent(
int
n)
{
theEvent.notify(
this
, n);
}
};
class
Target
{
public
:
void
onEvent(
const
void
* pSender,
int
& arg)
{
std::cout <<
"onEvent: "
<< arg << std::endl;
}
};
int
main(
int
argc,
char
** argv)
{
Source source;
Target target;
source.theEvent += Poco::delegate(&target, &Target::onEvent);
source.fireEvent(42);
source.theEvent -= Poco::delegate(&target, &Target::onEvent);
return
0;
}
|