觀察者設(shè)計模式是使用最頻繁的設(shè)計模式之一,在很多的地方都用使用到展东,比如:RxJava,EventBus,以及GUI的各種事件中等等棒拂。
一倒谷、初步認(rèn)識:
過年放假回家都需要提前買票莱坎,但是對于土豪就不需要買票了哈衣式,往往都是通過小程序,App等一些渠道去購買檐什,都怕錯過搶票的時間碴卧,于是我們關(guān)注了12306購票小程序,進(jìn)行購買火車票乃正,買完之后就取消關(guān)注小程序住册。
上面存在幾個角色小程序(被觀察者 ),需要購買后車票的人(觀察者)是用過關(guān)注將兩者進(jìn)行聯(lián)系起來,當(dāng)關(guān)注之后被觀察者有狀態(tài)改變瓮具,都會立即通知被觀察者荧飞,觀察者根據(jù)自己的情況做出相應(yīng)的動作。
二搭综、進(jìn)步熟悉:
上面我們大概對觀察者的作用有了淺層的認(rèn)識,這對接下來的學(xué)習(xí)很有幫助划栓。
1.首先來看一下觀察者模式(Observe Pattern)的正經(jīng)定義:定義對象之間的一對多依賴關(guān)系兑巾,使得每當(dāng)一個對象狀態(tài)發(fā)生改變時,其相關(guān)依賴對象皆得到通知并被自動更新忠荞。
2.那么它如何實現(xiàn)這么神奇的功能的呢蒋歌?
先來看一下它的結(jié)構(gòu)圖
image.png
從圖中我們可以看到之前說的目標(biāo)和觀察者。只不過這里的目標(biāo)和觀察者都被抽象化了委煤。我們來逐一認(rèn)識:
(1)Observable(被觀察者)
它是指被觀察者的對象中堂油,提供一系列對觀察者進(jìn)行管理的方法,比如addObserver()添加到集合中碧绞,removeObserver()從集合中移出去府框,nofityObservers()通知集合中所有的觀察者,pushObservers()給集合中所有的觀察者推送消息讥邻。
(2)WeChatServerObservable(具體目標(biāo))
當(dāng)它的狀態(tài)的改變時就會通知各個觀察者迫靖,同時還實現(xiàn)了在目標(biāo)類中定義的抽象邏輯方法(如果有的話)
(3)Observer(抽象觀察者)
它是一個接口院峡,觀察者將對觀察目標(biāo)狀態(tài)的改變做出相應(yīng)的反應(yīng)該接口定義了更新數(shù)據(jù)的方法update。
(4)UserPerson(抽象觀察者)
它實現(xiàn)了抽象觀察者對象的updata方法系宜。
3.接下來通過一個代碼實例來加深對上面的結(jié)構(gòu)圖的理解
目標(biāo)Observable.java
interface Observable {
//添加觀察者
fun addObserver(observer:Observer)
//移除觀察者
fun removeObserver(observer: Observer)
//推送消息給觀察者
fun pushObservers(message:Any)
//通知所有的觀察者
fun nofityObservers()
}
具體目標(biāo)類WeChatServerObservable.java
class WeChatServerObservable :Observable {
private var observers:MutableList<Observer> = ArrayList()
private var message:Any?=null;
override fun addObserver(observer: Observer) {
observers.add(observer!!)
}
override fun removeObserver(observer: Observer) {
observers.remove(observer)
}
override fun nofityObservers() {
observers.forEach {
it.update(message!!)
}
}
override fun pushObservers(message: Any) {
this.message= message
nofityObservers()
}
}
觀察者接口 Observer 定義一個更新的方法
interface Observer {
fun update(mssage:Any)
}
具體的觀察者 UserPerson.java
class UserPerson :Observer{
private var name:String?=null
constructor(name:String){
this.name =name
}
override fun update(mssage: Any) {
Log.e("TAG","$name----$mssage")
}
}
最后測試:
public static void main(String[] args) {
test();
}
public static void test(){
//創(chuàng)建一個微信服務(wù)
Observable observable =new WeChatServerObservable();
//創(chuàng)建多個觀察者
Observer user1 =new UserPerson("小胖1");
Observer user2 =new UserPerson("小胖2");
observable.addObserver(user1);
observable.addObserver(user2);
//推送消息
observable.pushObservers("明天早上八點開始搶票照激!");
}
#######將兩個觀察者添通過addObserver()方法添加到觀察者集合中,然后由目標(biāo)來發(fā)送一條更新的消息盹牧。觀察者接收到消息后做出反應(yīng)俩垃。運行結(jié)果如下:
image.png