poco 1:Notifications

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值