一:模式理解
觀察者模式也可以稱為訂閱者模式。
無論是觀察者還是訂閱者,關注的是主題的變化。
主題發生某些變化時,需要發生通知給所有的觀察者和訂閱者。
觀察者和訂閱者可以取消對主題的觀察或訂閱。
一些對象需要能感知到一個對象變了(做了某些操作)。假設只有一個主題。
二:例子
你是個富二代,家裡有很多僕人。
為了方便,只舉例三種,分別是程序員,老司機,女僕。
他們都繼承自Servant抽象類,並且都有跪舔的技能,即guitian方法。
每個僕人都有一個fuErDai屬性,代表心中時刻都有主人。
並且在構造器中直接把自己作為富二代的僕人。
富二代比較民主,允許僕人們可以自主決定參加工作或是不幹了,分別對應add和remove方法。
不同僕人跪舔主人的方法不一樣,設置為抽象方法。
分別新建程序員,老司機,女僕三個類。
作為富二代的你,也有一個對應的類,FuErDai。
你有三個屬性,分別是僕人隊列,開心指數,健康指數。
有添加僕人和刪除僕人的方法。
在沒有觀察者模式之前,為了防止你不舒服了或是不開心了,僕人們隔三差五都需要來詢問一次。
僕人們發現每次走進你房間的時候,你總是對著藍天白雲的電腦桌面發呆。同時,你也覺得很不開心。
有了觀察者模式之後,當你的開心指數或者健康指數變化的時候,就會通知每個僕人,即notifyServants,每個僕人都會前來跪舔你。
輸入/輸出:
表演敲代碼!
老司機開個車讓富二代開心開心!
如果你追到我,我就和你嘿嘿嘿!
老司機開個車讓富二代開心開心!
如果你追到我,我就和你嘿嘿嘿!
可以看到,當你健康指數變化的時候,所有僕人都會前來跪舔。
某天,程序員突然想起之前你答應帶他去徹夜鼓掌卻一直沒再提起,調用了remove方法,不再作為你的僕人。
在你的指數再次變化的時候,程序員將不會來跪舔。
三:再理解
在例子中,作為富二代的你就是主題,你的僕人們都是觀察者/訂閱者。
僕人們再也不用輪詢來檢查你的變化。
在通知僕人的方法notifyServants中,可以傳參,例子為方便沒傳遞參數。
在Java util包中有觀察者模式的實現。
觀察者實現Observer接口,實現update方法;
主題繼承Observable類,意思為可被觀察,底層用Vector<Observer> obs保存所有的觀察者,可做到多線程安全;
在主題變化時,可調用setChanged()和notifyObservers()方法來通知觀察者,觀察者們執行update()方法;
觀察者可通過調用addObserver(this)和deleteObserver(this)方法加入/退出主題的觀察者隊列。
5.Java util自帶Observable是個類,主題繼承這個類,就不能再繼承其他類,不利於擴展。
6.觀察者模式中,主題擁有一個觀察者列表,觀察者又引用了主題。
學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群346942462,我們一起學Java!