poco 1:Notifications

来源:互联网 发布:淘宝115会员怎么搜索 编辑:程序博客网 时间:2024/06/08 00:37

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 0
原创粉丝点击