2015-01-27 星期二 20:52:54
本系列为POCO库的理解,先从通知和事件说起。
1、Notifications时序图
2、Notifications Class
3、Notifications Demo
NotificationCenterTest.cpp
-
test1 无Observer post也不会异常
1
2
3
4
5
|
void
NotificationCenterTest::test1()
{
NotificationCenter nc;
nc.postNotification(
new
Notification);
}
|
-
test2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
void
NotificationCenterTest::test2()
{
NotificationCenter nc;
Observer<NotificationCenterTest, Notification> o(*
this
, &NotificationCenterTest::handle1);
nc.addObserver(o);
assert
(nc.hasObserver(o));
assert
(nc.hasObservers());
assert
(nc.countObservers() == 1);
nc.postNotification(
new
Notification);
assert
(_set.size() == 1);
assert
(_set.find(
"handle1"
) != _set.end());
nc.removeObserver(Observer<NotificationCenterTest, Notification>(*
this
, &NotificationCenterTest::handle1));
assert
(!nc.hasObserver(o));
assert
(!nc.hasObservers());
assert
(nc.countObservers() == 0);
}
void
NotificationCenterTest::handle1(Poco::Notification* pNf)
{
poco_check_ptr (pNf);
AutoPtr<Notification> nf = pNf;
_set.insert(
"handle1"
);
}
|
-
其他的 testN略过
4、Notifications 分析
可以看出,Notifications的本质就是观察者模式(订阅、发布),发布者用vector来存储订阅者。
Demo中Source和Target都是NotificationCenterTest(实际应用中Source和Target都是独立的,例如Mouse/GUI)。
nc.postNotification(
new
Notification)中的形参Notification从source-->Target。
Notification就是一张通知单(info载体),source可以在postNotification之前对Notification赋值后,
再由postNotification传递给Target(例如Mouse/GUI,Notification就可以携带Mouse的坐标&状态信息)。
模板形参 C对应Target Class,N对应Notification Class。
1
2
3
|
template
<
class
C,
class
N>
class
Observer:
public
AbstractObserver
{};
|