poco 1:Notifications

本文介绍了POCO库中的通知机制实现,通过观察者模式实现消息的订阅与发布。源码分析展示了如何创建通知中心、添加及移除观察者,并通过实例演示了通知的发送流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值