观察者模式的模式:在线和离线

原创
2013/03/16 19:33
阅读数 175

观察者模式是最基本的设计模式之一,用于解耦一对多的通信。

其实很多人都只知道它的第一种模式,也就是最典型的在线模式:subject存储了多个观察者的实例引用,当事件触发时,通过回调来通知观察者。

java中的listener,android中的listener等均如此。之所以称为在线(online),那是由于通知是基于引用的实例,所以只有当观察者的实例存在时(online),通知才是有效的。

显然,在线模式只能工作于客户的生命周期内,客户非激活状态下的通知是无法实现的。 

但是,实际世界中,很多移动平台中都是需要离线通知这样一种机制,即,既希望可以被通知,不错过通知,又由于某些限制而不能让客户端实例一直激活(如耗电,耗内存等)。 一个典型的例子,闹铃提醒应用,就是典型的离线需求。

 离线通知的典型实现是基于event而非基于回调引用,从而不和观察者的实例(生命周期)绑定。

此时,观察者注册时,典型的是注册一份契约(通常是字符串,比如url,mime type,scheme等等),而非观察者本身。然后观察者对外宣布支持这份契约(比如通过manifest类似的组件申明文件)。

运行时,事件发生时,subject简单的委托系统去通知对当前事件感兴趣的客户。系统启动时,已经完成了组件的注册,使得组件类和契约绑定。那么,系统就可以方便的找到申明对某某事件感兴趣的契约,从而找到组件类,然后加载并实例化它,并调用它的某个预定义的api来处理该通知。

android中的broadcast receiver和pendingintent,brew中的registernotify都是离线通知的典型例子。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部