觀察者模式
1.觀察者模式也被成為發(fā)布/訂閱模式;
2.一種一對多的依賴關(guān)系,多個觀察者對象同時監(jiān)聽某一個主題對象,這個主題對象狀態(tài)發(fā)生變化的時候,會通知所有的觀察者對象,使得觀察者對象可以自動更新自己.
3.是一種被動的接收來自觀察對象的角色.
抽象觀察者角色: 為所有具體的觀察者定義一個接口,在得到主題(被觀察者)通知的時候更新自己;
抽象主題角色: 把所有的觀察者對象用一個集合保存;提供一個接口,可以增加和刪除觀察者角色,一般會用抽象類和接口實現(xiàn).
具體觀察者對象: 實現(xiàn)抽象觀察者角色所要求的更新接口,以便使得本身的狀態(tài)和主題狀態(tài)相協(xié)調(diào);通常我們會使用一個子類實現(xiàn),若有需要的話具體觀察者對象可以保存一個具體被觀察者對象的引用;
具體主題角色: 具體主題也就是被觀察者對象,內(nèi)部狀態(tài)發(fā)生改變的時候,給所有登記過的觀察者發(fā)出通知.具體主題角色使用一個子類實現(xiàn).
Android中的具體使用:
Android中廣播以及Listview數(shù)據(jù)刷新,調(diào)用適配器的notifyDataSetChanged函數(shù),以及EventBus都使用到了觀察者模式.(其他還有如MVC模式,消息推送,事件監(jiān)聽等).
?????? 當(dāng)ListView的數(shù)據(jù)發(fā)生變化時撮抓,調(diào)用Adapter的notifyDataSetChanged函數(shù)碗誉,這個函數(shù)又會調(diào)用DataSetObservable的notifyChanged函數(shù)心软,這個函數(shù)會調(diào)用所有觀察者(AdapterDataSetObserver)的onChanged方法叉存,在onChanged函數(shù)中又會調(diào)用ListView重新布局的函數(shù)使得ListView刷新界面。
觀察者模式的例子:
被觀察者--抽象主題角色:添加/刪除觀察者對象,集合保存觀察者對象;通知觀察者對象的方法
第三步: 我們創(chuàng)建2個類實現(xiàn)抽象觀察者接口,分別是JimObeserver和TomObserver;
以及具體的被觀察者角色
ok,觀察者和被觀察者都創(chuàng)建完成,我們來測試一下.
運行結(jié)果如下