摘要:觀察者模式當對象間存在一對多關(guān)系時,則使用觀察者模式。觀察者模式屬于行為型模式。觀察者模式?jīng)]有相應的機制讓觀察者知道所觀察的目標對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標發(fā)生了變化。
觀察者模式
當對象間存在一對多關(guān)系時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知它的依賴對象。觀察者模式屬于行為型模式。
介紹意圖:定義對象間的一種一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。
主要解決:一個對象狀態(tài)改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協(xié)作。
何時使用:一個對象(目標對象)的狀態(tài)發(fā)生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。
如何解決:使用面向?qū)ο蠹夹g(shù),可以將這種依賴關(guān)系弱化。
應用實例:1.拍賣的時候,拍賣師觀察最高標價,然后通知給其他競價者競價。
2.打團時每個職業(yè)做不同的事情。
優(yōu)點: 1、觀察者和被觀察者是抽象耦合的。 2、建立一套觸發(fā)機制。
缺點: 1、如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。 2、如果在觀察者和觀察目標之間有循環(huán)依賴的話,觀察目標會觸發(fā)它們之間進行循環(huán)調(diào)用,可能導致系統(tǒng)崩潰。 3、觀察者模式?jīng)]有相應的機制讓觀察者知道所觀察的目標對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標發(fā)生了變化。
簡單的說就是:多個對象去觀察一個對象是否發(fā)出號令(消息),然后做出相應響應動作
以DNF打團為例子:
當團長發(fā)出攻堅開始的消息時所有的隊友開始輸出。
創(chuàng)建一個職業(yè)的抽象類(觀察者接口):Hero
public abstract class Hero { /** * 打團 * @param msg */ public abstract void datuan(String msg); }
分別創(chuàng)建三個職業(yè)(觀察者)
創(chuàng)建一個紅眼:Hongyan
public class Hongyan extends Hero { private static final String ROLE = "帝血弒天"; @Override public void datuan(String msg) { System.out.println(msg+ ROLE +":血魔:弒天! "); } }
創(chuàng)建一個奶爸:Naiba
public class Naiba extends Hero { private static final String ROLE = "神思者"; @Override public void datuan(String msg) { System.out.println(msg + ROLE + ": 阿波克列!"); } }
創(chuàng)建一個籃拳:Lanquan
public class Lanquan extends Hero { private static final String ROLE = "正義仲裁者"; @Override public void datuan(String msg) { System.out.println(msg+ ROLE + ":粉碎吧!"); } }
創(chuàng)建一個團長(被觀察者):Captain
public class Captain { private Listheroes = new ArrayList<>(); public void setMsg(String msg) { notifyAll(msg); } //訂閱 public void addTeam(Hero hero) { heroes.add(hero); } //通知所有訂閱的觀察者 private void notifyAll(String msg) { for (Hero observer : heroes) { observer.datuan(msg); } } }
主程序:Main
public class Main { public static void main(String[] args) { Lanquan lanquan = new Lanquan(); Hongyan hongyan = new Hongyan(); Naiba naiba = new Naiba(); Captain captain = new Captain(); captain.addTeam(lanquan); captain.addTeam(hongyan); captain.addTeam(naiba); captain.setMsg("超時空攻堅戰(zhàn)開始-"); } }
執(zhí)行結(jié)果:
超時空攻堅戰(zhàn)開始-正義仲裁者:粉碎吧! 超時空攻堅戰(zhàn)開始-帝血弒天:血魔:弒天! 超時空攻堅戰(zhàn)開始-神思者: 阿波克列!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/73582.html
摘要:在的開發(fā)者工具中,通過斷點調(diào)試,我們能夠非常方便的一步一步的觀察的執(zhí)行過程,直觀感知函數(shù)調(diào)用棧,作用域鏈,變量對象,閉包,等關(guān)鍵信息的變化。其中表示當前的局部變量對象,表示當前作用域鏈中的閉包。 showImg(https://segmentfault.com/img/remote/1460000008404321); 在前端開發(fā)中,有一個非常重要的技能,叫做斷點調(diào)試。 在chrome...
閱讀 1056·2021-11-15 18:06
閱讀 2414·2021-10-08 10:04
閱讀 2713·2019-08-28 18:03
閱讀 952·2019-08-26 13:42
閱讀 1978·2019-08-26 11:31
閱讀 2486·2019-08-23 17:13
閱讀 985·2019-08-23 16:45
閱讀 2137·2019-08-23 14:11