觀察者模式是相當常用的行為型設計模式,博主(也就是我)面試的時候也考到過手寫觀察者模式的題目,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 ...