一.觀察者模式介紹
觀察者模式是一個使用率非常高的模式,它最常用的地方是GUI系統(tǒng),訂閱-發(fā)布系統(tǒng)电谣。因為這個模式的一個重要作用就是解耦秽梅,將被觀察和觀察者解耦抹蚀,使他們之間的依賴性更小,甚至做到毫無依賴企垦。
二.觀察者模式的定義
定義對象間的一種一(Subject)對多(Observer)的依賴關(guān)系环壤,當(dāng)一個對象的狀態(tài)發(fā)送改變時,所以依賴于它的對象都得到通知并被自動更新钞诡。
三.觀察者模式使用場景
1. 對一個對象狀態(tài)的更新郑现,需要其他對象同步更新,而且其他對象的數(shù)量動態(tài)可變荧降。
2. 對象僅需要將自己的更新通知給其他對象而不需要知道其他對象的細(xì)節(jié)接箫。
四.觀察者模式中的角色
1. Subject(被觀察者)
★ 抽象主題,被觀察(Observable)的角色,抽象主題角色把所有觀察者對象的引用保存在一個集合里朵诫,每個主題都可以有任意數(shù)量的觀察者辛友,抽象主題提供一個接口,可以增加和刪除觀察者對象剪返。
2. ConcreteSubject(具體被觀察者)
★ 具體主題废累,該角色將有關(guān)狀態(tài)存入具體觀察者對象,在具體主題的內(nèi)部狀態(tài)改變時脱盲,給所有注冊過的觀察者發(fā)出通知邑滨。
3. Observer(觀察者)
★ 抽象觀察者,該角色是觀察者的抽象類钱反,定義了一個更新接口掖看,使得在得到主題的更改通知時更新自己。
4. ConcreteObserver(具體觀察者)
★ 具體觀察者面哥,該角色實現(xiàn)抽象觀察者所定義的更新接口哎壳,以便在主題狀態(tài)發(fā)生變化時更新自身狀態(tài)。
五.Android源碼中的實例
1. 點型運用是大家熟悉的BaseAdapter幢竹,BaseAdapter關(guān)聯(lián)了一個DataSetObservable對象耳峦,并實現(xiàn)registerDataSetObserver和unregisterDataSetObserver兩個方法實現(xiàn)注冊和撤銷Observer,方法notifyDataSetChanged遍歷所有觀察者焕毫,并且調(diào)用他們的onChange()方法蹲坷,告知觀察者發(fā)生了變化驶乾。使用ListView和BaseAdapter組合時,當(dāng)BaseAdapter的item改變時循签,我們經(jīng)常會調(diào)用notifyDataSetChanged()级乐,通知Listview刷新。
2. BroadcastReceiver是Android的四大組件之一县匠,它作為應(yīng)用內(nèi)风科,進(jìn)程間的一種通信方式,能夠?qū)⒛硞€消息通過廣播的形式傳遞給它注冊的對應(yīng)廣播接收器的對象乞旦,接收對象需要通過Context的registerReceiver函數(shù)注冊到AMS中贼穆,當(dāng)通過sendBroadcast發(fā)送廣播時,所有注冊了對應(yīng)的IntentFilter的BroadcastReceiver對象就會接收到這個消息兰粉,BroadcastReceiver中的onReceiver方法就會被調(diào)用故痊,這就是典型的發(fā)布-訂閱模式,也就是觀察者模式玖姑。
六.總結(jié)
觀察者模式主要作用就是對象的解耦愕秫,將觀察者與被觀察者完全隔離,只依賴于Observer和Observable抽象焰络,使得它的擴(kuò)展性戴甩,靈活性強(qiáng),耦合度特別低闪彼,代碼更加簡潔甜孤,提升代碼質(zhì)量。
優(yōu)點:
● ?觀察者和被觀察者之間是抽象耦合备蚓,應(yīng)對業(yè)務(wù)變化
● ?增強(qiáng)系統(tǒng)靈活性课蔬,可擴(kuò)展性
缺點:
● ?在應(yīng)用觀察者模式時需要考慮一下開發(fā)效率和運行效率的問題,程序中包括一個被觀察者和多個觀察者郊尝,開發(fā)調(diào)試等內(nèi)容會比較復(fù)雜二跋,而且在Java中消息的通知默認(rèn)是順序執(zhí)行的,一個觀察者卡頓流昏,會影響整體的執(zhí)行效率扎即,在這種情況下一般考慮采用異步的方式。
七.基于觀察者模式的開源庫
●? greenrobot 的 EventBus 源碼地址:https://github.com/greenrobot/EventBus
●? square?的 otto?源碼地址:https://github.com/square/otto