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 {}; |