觀察者模式是最基本的設計模式之一,用於解耦一對多的通訊。 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都是離線通知的典型例子。 事件