工廠模式分為簡單工廠,工廠和抽象工廠,三種工廠的實現是越來越復雜的。
觀察者模式
? ? ? 本質上就是一種訂閱/發布的模型,從邏輯上來說就是一對多的依賴關系。
? ? ? 什么意思呢?好比是一群守衛盯著一個囚犯,只要囚犯一有異動,守衛就必須馬上采取行動(也有可能是更新狀態,本質上也是一種行動),那么守衛就是觀察者,囚犯就是被觀察者。
? ? ? 解決的問題:
? ? ? 在系統中,實現這種一對多的而且之間有一定關聯的邏輯的時候,由于需要保持他們之間的協同關系,所以最簡便的方法是采用緊耦合。但是這樣加大了開發難度,很容易造成Bug
? ?? 觀察者模式就解決了這么一個問題,在保持一系列觀察者和被觀察者對象協同工作的同時,把之間解耦了。
? ??
意圖:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。
主要解決:一個對象狀態改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協作。
何時使用:一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。
如何解決:使用面向對象技術,可以將這種依賴關系弱化。
關鍵代碼:在抽象類里有一個 ArrayList 存放觀察者們。
應用實例:?1、京東上某個商品暫時沒貨,提示用戶關注后到貨通知,這個暫時無貨的商品是被觀察者,點擊關注這個商品的用戶就是觀察者。 2、老師針對成績在60分以下的同學定期發送最新的考題分析郵件,每輪考試下來都會有不及格的同學,由不及格變為及格的同學自動從郵件列表里移除,新的不及格的同學會被加進郵件列表里。
優點:?1、觀察者和被觀察者是抽象耦合的。 2、建立一套觸發機制。
缺點:?1、如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。 2、如果在觀察者和觀察目標之間有循環依賴的話,觀察目標會觸發它們之間進行循環調用,可能導致系統崩潰。 3、觀察者模式沒有相應的機制讓觀察者知道所觀察的目標對象是怎么發生變化的,而僅僅只是知道觀察目標發生了變化。
使用場景:?1、有多個子類共有的方法,且邏輯相同。 2、重要的、復雜的方法,可以考慮作為模板方法。