<!-- more -->java
本文原創地址,
個人博客
:
https://jsbintask.cn/2019/04/15/designpattern/observer/(食用效果最佳),轉載請註明出處!
觀察者模式定義了對象間的一種一對多依賴關係,當一個對象狀態發生改變時,觀察者們均可以作出相應的更新,使得系統更易於擴展!代碼地址:
https://github.com/jsbintask22/design-pattern-learninggit
上面這個過程咱們能夠抽象出來兩個主題,女神小麗
,備胎小豪,小吳,小李
,咱們用代碼模擬這個追女神的過程。github
Beauty
表明女神,LittleBoy
表示備胎,他們時刻在關注着女神的朋友圈,但願得到互動,代碼實現以下:
編程
public class App { public static void main(String[] args) throws Exception{ Beauty beauty = new Beauty(); // 成功添加了女神微信 LittleBoy littleBoy = new LittleBoy(beauty); // 開始查看女神朋友圈 littleBoy.start(); // 5s後,女神發佈了朋友圈。 Thread.sleep(5000L); beauty.publishWechat(); System.in.read(); } }
運行結果以下:
嗯!彷佛很完美! 美中不足的是好像LittleBoy
的run方法一直在輪詢查看女神朋友圈,它沒辦法作本身的事情了:
這樣下去很快他就會失去和女神互動的耐心! 因此咱們稍微修改下,讓這段代碼看起來更加」智能」。設計模式
爲了避免讓LittleBoy
一直輪詢查看女神狀態,咱們能夠修改成女神主動推送她的狀態給「備胎們」,這樣他們就能夠去作其餘事情了!
微信
public class App { public static void main(String[] args) throws Exception{ Beauty beauty = new Beauty(); LittleBoy littleBoy = new LittleBoy(); // 添加女神微信 beauty.littleBoy = littleBoy; // 發佈動態 beauty.publishWechat(); } }
嗯!這樣一來就智能多了! 女神更新朋友圈後主動推送消息給備胎!備胎不用死守着女神的朋友圈,而是收到消息後自動去查看。因此他們的關係是這樣了:
可是,如今又有一個新問題!這段代碼好像顯得不夠面向對象
,不夠專業。框架
既然這樣,咱們把這段代碼修改下,讓它變得「靈活」,更加「面向對象」些!測試
既然要靈活,面向對象。咱們這麼處理:將女神抽象爲一個接口,而且她要可以刪除備胎,添加備胎,通知備胎。同時咱們將備胎抽象爲一個接口,他可以在收到女神通知後及時作出反應!
Beauty:
LittleBoy:
它們分別有一個實現:BeautyImpl
和LittleBoyImpl
:
測試代碼:spa
public class App { public static void main(String[] args) { Beauty beauty = new BeautyImpl(); LittleBoy boy1 = new LittleBoyImpl("小豪"); LittleBoy boy2 = new LittleBoyImpl("小吳"); // 添加兩個備胎 beauty.addLittleBoy(boy1); beauty.addLittleBoy(boy2); // 發佈朋友圈 beauty.publishWechat("最美的不是下雨天,是曾和你一塊兒躲過雨的屋檐!"); // 刪除備胎1,而且新添加了備胎3 beauty.removeLittleBoy(boy1); beauty.addLittleBoy(msg -> { System.out.println(" 小李:哎喲,不錯哦!"); }); // 再次發佈朋友圈 beauty.publishWechat("哪裏有彩虹告訴我。。。"); } }
嗯!經過面向接口編程完美的解決了上面的問題,如今女神這個類已經變得很是靈活了,仔細觀察,咱們已經把咱們上面的說的案例徹底實現!如今它們的關係是這樣的:
設計
觀察者模式這種發佈與訂閱的思想
使用的很是普遍,基本各個框架,思想都能看到它的身影,而jdk中也已經抽象了觀察與被觀察者:java.util.Observer
表示觀察者:java.util.Obserable
表示被觀察者(例如上面的女神):
而後美中不足的是,jdk把Observable設計成了一個類,這並不利於擴展! 固然咱們仍然能夠本身實現接口,就像上面所作的。
咱們從觀察者模式特色入手,經過一個案例,一步一步完善了觀察着的寫法,特色!組後介紹了jdk總已有的實現!
關注我,這裏只有乾貨!
同系列文章:
從未這麼明白的設計模式(一):單例模式