最近小Y在看《反黑》這部劇,最引人回味的是堪稱經典的山雞哥飛上枝頭變鳳凰,當初的古惑仔棄暗投明作警察,可謂是涅槃重生啊。設計模式
張sir: 山雞,和興盛最近很囂張啊,該是你大展身手的時候了,你要以最短期打入他們內部獲取犯罪證據,同時你要改名爲鳳凰,UnderStand?異步
鳳凰仔: Yes,Sir。ide
通過一段時間潛伏,鳳凰哥終於打入和興盛內部,成爲韓彬的一把手。時刻監視着大佬們的一舉一動。this
鳳凰仔: 張sir,和興盛大佬們齊聚一塊兒,準備搞場大龍鳳,你立馬拖班人馬過來壓壓驚,順便來了一鍋端。spa
根據鳳凰監提供的證據,警方成功把這個社團搞得雞飛狗跳。最後鳳凰仔用槍指着韓彬的頭來了一句:一直在你身邊的警察,是我。來了一個一百八十度的轉彎,山雞變鳳凰。設計
鳳凰哥、Laughing哥是港劇臥底的佼佼者,讓人讚不絕口。在設計模式中,照樣有充當這樣角色的存在——觀察者模式。調試
觀察者模式也叫作發佈訂閱模式,定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則全部依賴於它的對象都會獲得通知並被自動更新。code
Subject被觀察者
定義被觀察者必須實現的職責,它必須可以動態地增長、取消觀察者。它通常是抽象類或者是實現類,僅僅完成做爲被觀察者必須**實現的職責:**管理觀察者並通知觀察者。cdn
Observer觀察者
觀察者接收到消息後,即進行update(更新方法)操做,對接收到的信息進行處理。server
ConcreteSubject具體的被觀察者
定義被觀察者本身的業務邏輯,同時定義對哪些事件進行通知。
ConcreteObserver具體的觀察者
每一個觀察在接收到消息後的處理反應是不一樣,各個觀察者有本身的處理邏輯。
在反黑組在監視這幾位大佬的同時,商業調查科等等其餘警察部門也在監視着,爲了使各部門行動統一,鳳凰仔收集到的證據統一使用,根據其反饋回來的消息,各部門作相應的準備。
①和興盛的抽象被觀察者
public abstract class HeXingSheng {
//保存監視和興的警察部門
private List<Police> polices=new ArrayList<>();
//增長監聽的警察部門
public abstract void addPoliceObserver(Police police);
//刪除監聽的警察部門
public abstract void deletePoliceObserver(Police police);
//通知每一個監聽部門做出反應
public abstract void notifyPolices(String tip);
}
複製代碼
②和興盛大佬們的具體被觀察類
public class HeadOfGang extends HeXingSheng {
@Override
public void addPoliceObserver(Police police) {
this.polices.add(police);
}
@Override
public void deletePoliceObserver(Police police) {
this.polices.remove(police);
}
@Override
public void notifyPolices(String tip) {
for(Police police:polices){
police.action(tip);
}
}
}
複製代碼
③警察部門的抽象觀察者
public abstract class Police {
//根據信息做出反應
public abstract void action(String action);
}
複製代碼
④反黑組
public class FanHeiTeam extends Police {
@Override
public void action(String action) {
System.out.println("臥底鳳凰提供的情報:"+action);
System.out.println("反黑組根據情報對和興盛進行相關黑社會行爲進行控告。");
}
}
複製代碼
⑤商業調查科
public class ShangYeTeam extends Police{
@Override
public void action(String action) {
System.out.println("臥底鳳凰提供的情報:"+action);
System.out.println("商業調查科根據情報對和興盛進行相關商業行爲進行控告。");
}
}
複製代碼
⑥Client
public class Client {
public static void main(String[] args) {
//被觀察的對象-和興盛
HeXingSheng xingSheng=new HeadOfGang();
//觀察對象-反黑組、商業調查科
Police fanHeiTeam=new FanHeiTeam();
Police shangye=new ShangYeTeam();
//增長觀察者
xingSheng.addPoliceObserver(fanHeiTeam);
xingSheng.addPoliceObserver(shangye);
//鳳凰仔收集到證據,通知各部門準備行動
xingSheng.notifyPolices("和興盛大佬們聚在一塊兒搞龍鳳。");
}
}
複製代碼
輸出的結果爲:
//反黑組
臥底鳳凰提供的情報:和興盛大佬們聚在一塊兒搞龍鳳。
反黑組根據情報對和興盛進行相關黑社會行爲進行控告。
//商業調查科
臥底鳳凰提供的情報:和興盛大佬們聚在一塊兒搞龍鳳。
商業調查科根據情報對和興盛進行相關商業行爲進行控告。
複製代碼
若是一個被觀察者對象有不少直接和間接的觀察者的話,將全部的觀察者都通知到會花費不少時間,效率讓人擔心。
一個被觀察者,多個觀察者,開發和調試就會比較複雜,並且在Java中消息的通知默認是順序執行,一個觀察者卡殼,會影響總體的執行效率。在這種狀況下,通常考慮採用異步的方式。
觀察者模式在項目中很是經常使用,可是從上面頁面知道觀察者模式也相對存在着缺點,一是廣播鏈的問題。另一個就是異步處理問題,在開發中須要格外注意。