學(xué)習(xí)Java設(shè)計(jì)模式之觀察者模式
- 觀察者模式:對(duì)象間的一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象(被觀察)。
以便一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),所有依賴于它的對(duì)象都得到通知并發(fā)生相應(yīng)的變化。
觀察者模式有很多實(shí)現(xiàn)方式:該模式必須包含觀察者和被觀察對(duì)象兩種角色。觀察者和被觀察者之間存在“觀察”的邏輯關(guān)系,當(dāng)被觀察者發(fā)生改變的時(shí)候,觀察者就會(huì)觀察到這樣的變化,發(fā)出相應(yīng)的改變。
/** * 觀察者接口:觀察者,需要用到觀察者模式的類需實(shí)現(xiàn)此接口 */ public interface Observer { public void update(Object obj); }
/** * 被觀察者(一般是抽象類,方便擴(kuò)展):申明方法,發(fā)生了某種變化,將變化通知觀察者。 */ public interface BeenObserved { public void addObserver(Observer obs);//添加觀察者對(duì)象 public void removeObserver(Observer obs);//觀察者對(duì)象 public void notifyObservers(String changed);//通知觀察者對(duì)象發(fā)生對(duì)應(yīng)變化 }
/** * 目標(biāo)被觀察者:實(shí)現(xiàn)被觀察者的接口,對(duì)觀察者對(duì)象進(jìn)行對(duì)應(yīng)操作 */ public class ConcreteWatched implements BeenObserved { // 觀察者對(duì)象集合 private List<Observer> list = new ArrayList<Observer>(); @Override public void addObserver(Observer obs)// 添加被觀察者 { if (!list.contains(obs)) { list.add(obs); } } @Override public void removeObserver(Observer obs)// 觀察者告訴被觀察者要撤銷觀察,被觀察者從容器中將觀察者去除 { if (list.contains(obs)) { list.remove(obs); } } @Override public void notifyObservers(String change) { // 遍歷對(duì)象,分別調(diào)用方法進(jìn)行更新通知操作 for (Observer obs : list) { obs.update(change); } } }
/** * 目標(biāo)被觀察者(具體觀察者) */ public class SpecificWatcher implements Observer { @Override public void update(Object obj) { System.out.println(obj.toString());//發(fā)生的變化 } } /** * 測(cè)試代碼 * @description: */ public class Test { public static void main(String[] args) { BeenObserved bObs = new ConcreteWatched(); Observer obs1 = new SpecificWatcher(); Observer obs2 = new SpecificWatcher(); Observer obs3 = new SpecificWatcher(); bObs.addObserver(obs1);//添加觀察者對(duì)象 bObs.addObserver(obs2); bObs.addObserver(obs3); bObs.notifyObservers("***收到了通知***"); System.out.println("----------分隔線--------------"); bObs.removeObserver(obs2);//移除觀察者 bObs.notifyObservers("***少了一個(gè)觀察者***"); } }
最后打印結(jié)果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)java程序設(shè)計(jì)有所幫助。
- Java設(shè)計(jì)模式之觀察者模式原理與用法詳解
- JAVA中常用的設(shè)計(jì)模式:?jiǎn)卫J?,工廠模式,觀察者模式
- Java設(shè)計(jì)模式—觀察者模式詳解
- 23種設(shè)計(jì)模式(13)java觀察者模式
- Java設(shè)計(jì)模式之觀察者模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java經(jīng)典設(shè)計(jì)模式之觀察者模式原理與用法詳解
- java設(shè)計(jì)模式之觀察者模式學(xué)習(xí)
- java設(shè)計(jì)模式之觀察者模式
- 實(shí)例解析觀察者模式及其在Java設(shè)計(jì)模式開(kāi)發(fā)中的運(yùn)用
- Java設(shè)計(jì)模式開(kāi)發(fā)中使用觀察者模式的實(shí)例教程
- 用Java設(shè)計(jì)模式中的觀察者模式開(kāi)發(fā)微信公眾號(hào)的例子
- 深入解析Java設(shè)計(jì)模式編程中觀察者模式的運(yùn)用
- Java設(shè)計(jì)模式之觀察者模式(Observer模式)介紹
- Java通俗易懂系列設(shè)計(jì)模式之觀察者模式
相關(guān)文章
java中 String和StringBuffer的區(qū)別實(shí)例詳解
這篇文章主要介紹了java中 String和StringBuffer的區(qū)別實(shí)例詳解的相關(guān)資料,一個(gè)小的例子,來(lái)測(cè)試String和StringBuffer在時(shí)間和空間使用上的差別,需要的朋友可以參考下2017-04-04PowerJob的OhMyClassLoader工作流程源碼解讀
這篇文章主要介紹了PowerJob的OhMyClassLoader工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Caused by: java.lang.ClassNotFoundException: org.apache.comm
這篇文章主要介紹了Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type異常,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07關(guān)于Spring多數(shù)據(jù)源TransactionManager沖突的解決方案
這篇文章主要介紹了關(guān)于Spring多數(shù)據(jù)源TransactionManager沖突的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07java中加密的實(shí)現(xiàn)方法(MD5,MD2,SHA)
這篇文章主要介紹了java中加密的實(shí)現(xiàn)方法(MD5,MD2,SHA)的相關(guān)資料,這里提供三種實(shí)現(xiàn)加密的方法,大家可以對(duì)比一下,需要的朋友可以參考下2017-08-08基于Beanutils.copyProperties()的用法及重寫提高效率
這篇文章主要介紹了Beanutils.copyProperties( )的用法及重寫提高效率的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09