观察者模式是最基本的设计模式之一,用于解耦一对多的通讯。 java
其实不少人都只知道它的第一种模式,也就是最典型的在线模式:subject存储了多个观察者的实例引用,当事件触发时,经过回调来通知观察者。 android
java中的listener,android中的listener等均如此。之因此称为在线(online),那是因为通知是基于引用的实例,因此只有当观察者的实例存在时(online),通知才是有效的。 设计模式
显然,在线模式只能工做于客户的生命周期内,客户非激活状态下的通知是没法实现的。 api
可是,实际世界中,不少移动平台中都是须要离线通知这样一种机制,即,既但愿能够被通知,不错过通知,又因为某些限制而不能让客户端实例一直激活(如耗电,耗内存等)。 一个典型的例子,闹铃提醒应用,就是典型的离线需求。 url
离线通知的典型实现是基于event而非基于回调引用,从而不和观察者的实例(生命周期)绑定。 spa
此时,观察者注册时,典型的是注册一份契约(一般是字符串,好比url,mime type,scheme等等),而非观察者自己。而后观察者对外宣布支持这份契约(好比经过manifest相似的组件申明文件)。 设计
运行时,事件发生时,subject简单的委托系统去通知对当前事件感兴趣的客户。系统启动时,已经完成了组件的注册,使得组件类和契约绑定。那么,系统就能够方便的找到申明对某某事件感兴趣的契约,从而找到组件类,而后加载并实例化它,并调用它的某个预约义的api来处理该通知。 生命周期
android中的broadcast receiver和pendingintent,brew中的registernotify都是离线通知的典型例子。 事件