設計模式之觀察者模式

2021-09-28 11:29:56 字數 3921 閱讀 6365

觀察者模式是相當常用的行為型設計模式,博主(也就是我)面試的時候也考到過手寫觀察者模式的題目,spring事件中也應用到了觀察者模式(其實我還沒有深入學習spring,這是我聽說的),反正很重要就是了。

先說明一下業務場景,在我們的周圍有很多追星的人,她們大多數都是通過微博與愛豆進行互動,在愛豆發微博后關注了愛豆的粉絲都可以收到提醒,當然粉絲也可以取關愛豆,取關後無法獲得愛豆微博更新提醒。

觀察者模式定義了物件之間的一對多依賴,這樣一來,當乙個物件改變狀態時,它的所有依賴者會收到通知並自動更新。更詳細的說,被觀察者儲存了全部訂閱了它的觀察者物件的引用,並且提供了觀察者訂閱和取消訂閱的方法。在被觀察者狀態改變時通知全部觀察者。在上述業務場景中,愛豆就是被觀察者,粉絲就是被觀察者。

jdk提供了observer介面和observable抽象類作為抽象觀察者和抽象被觀察者,可以先看看這兩個類的api。

observer:

public inte***ce observer
observable:

public class observable 

//註冊此被觀察者的觀察者

public synchronized void addobserver(observer o)

}//登出此被觀察者的指定觀察者

public synchronized void deleteobserver(observer o)

public void notifyobservers()

//改變狀態時通知所有觀察者

public void notifyobservers(object arg)

for (int i = arrlocal.length-1; i>=0; i--)

((observer)arrlocal[i]).update(this, arg);

}//登出全部觀察者

public synchronized void deleteobservers()

//修改 修改標誌為true

protected synchronized void setchanged()

//重置修改標誌位為false

protected synchronized void clearchanged()

//被觀察者狀態是否改變

public synchronized boolean haschanged()

//返回訂閱此被觀察者的觀察者數量

public synchronized int countobservers()

}

從這兩個介面/類的api可以看出來,我們首先要有乙個observable和observer的實現類,具體被觀察者呼叫addobserver()方法(事實上就是向觀察者集合中新增乙個元素)使指定的具體觀察者訂閱自己;在具體被觀察者狀態改變(這裡的狀態是自定義的)時通過遍歷觀察者集合的方式挨個通知具體觀察者(即呼叫具體觀察者的update()方法);具體被觀察者呼叫deleteobserver()方法(在觀察者集合中刪除指定元素)使指定的觀察者取消訂閱。

需要特別注意的是,使用jdk自帶的觀察者模式,在具體被觀察者狀態改變時需要呼叫setchanged()方法修改changed為true,否則在notifyobservers()方法中並不會呼叫觀察者的update()方法。

用jdk自帶的觀察者模式實現以上業務場景:

具體被觀察者:

class kun extends observable

public void commenton(ikun ikun,string comment)

}觀察者抽象類:

//這個類不屬於觀察者模式的任何角色,純屬在此處需要

class ikun

public string getname()

public void setname(string name)

}具體觀察者:

//觀察者1

class ikun1 extends ikun implements observer

@override

public void update(observable o, object arg)

}//觀察者2

class ikun2 extends ikun implements observer

@override

public void update(observable o, object arg)

}

測試程式及輸出結果:

測試程式:

public static void main(string args)

輸出結果:

ikun們,鯤鯤發微博啦...

用觀察者模式實現以上的業務場景:

抽象被觀察者:

inte***ce idol

抽象觀察者:

inte***ce fans

具體被觀察者:

class kun implements idol

@override

public void follow(fans fans)

} @override

public void updatemicroblog(string microblog)

} @override

public void unfollow(fans fans)

public void setpersonalinformation(string personalinformation)

@override

public string getpersonalinformation()

}具體觀察者:

//觀察者1

class ikun1 implements fans

@override

public void commenton(string microblog)

@override

public void getidolpersonalinformation(idol idol)

public string getname()

public void setname(string name)

}//觀察者2

class ikun2 implements fans

@override

public void commenton(string microblog)

@override

public void getidolpersonalinformation(idol idol)

public string getname()

public void setname(string name)

}

測試程式及輸出結果:

測試程式:

public static void main(string args)

輸出結果:

ikun們,你們的鯤鯤發微博啦...

鯤鯤的屎獲取到了哥哥的資訊:姓名:菜虛鯤,性別:女,年齡:32

鯤鯤我愛你獲取到了哥哥的資訊:姓名:菜虛鯤,性別:女,年齡:32

ikun1上了六年級以後取關了鯤鯤就收不到鯤鯤的微博更新通知了...

ikun們,你們的鯤鯤發微博啦...

人家真的不是娘炮了啦...

由於時間關係(困死我了明天還要上班,**都是新鮮的剛敲的,例子都是現想的),這裡的例子並沒有寫多個被觀察者,粗略一想,乙個觀察者訂閱多個被觀察者的實現:或者在**中判斷哪個被觀察者,或者這個觀察者實現多個觀察者介面(每個觀察者介面對應乙個被觀察者)。

歡迎有大佬指錯!

設計模式之觀察者模式

首先說了乙個自己的小例子吧,前兩天我的乙個朋友來找我玩,因為路途比較遠,我需要知道他的位置,然後安排好時間去接他,那麼在這個例子中,我就是乙個觀察者,需要時時刻刻觀察他的位置,我的朋友就是乙個被觀察者。那麼需要知道我朋友的位置,就有兩種方式,第一,我自己打 問,第二,我的朋友告訴我,下面我們來看看這...

設計模式之觀察者模式

一 作用 讓多個觀察者監視某一物件的變化,如果物件變化,則通知所有觀察者。二 例子 抽象主題類 public abstract class subject 移除觀察者 public void detach observer observer 向觀察者 們 發出通知 public void notif...

設計模式之觀察者模式

觀察者模式的定義是 定義物件間的一種一對多的依賴關係。當乙個物件的狀態發生變化時,所有依賴它的物件都會得到通知並自動更新 報社跟讀者的例子 我們用報社和讀者之間的關係來模擬觀察者模式。包含以下主體 報社 news office 讀者介面 reader 具體讀者 reader 二逼青年 reader ...