最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式之觀察者模式原理與用法詳解

 更新時(shí)間:2020年06月02日 12:12:54   作者:wit_stan  
這篇文章主要介紹了Java設(shè)計(jì)模式之觀察者模式,結(jié)合實(shí)例形式詳細(xì)分析了Java設(shè)計(jì)模式之觀察者模式基本概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Java設(shè)計(jì)模式之觀察者模式原理與用法。分享給大家供大家參考,具體如下:

什么是觀察者模式


      可以這么理解:

                  觀察者模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。

                  這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,讓它們能夠自動(dòng)更新自己。

    也可以這樣理解:

                觀察者模式是關(guān)于多個(gè)對(duì)象想知道一個(gè)對(duì)象中數(shù)據(jù)變化情況的一種成熟模式。觀察者模式中有一個(gè)稱作“主題”的對(duì)象和若干個(gè)稱作“觀察者”的對(duì)象,“主題”和“觀察者”之間是一種一對(duì)多的依賴關(guān)系。

                當(dāng)“主題”的狀態(tài)發(fā)生變化時(shí),所有“觀察者”都得到通知。


       日常生活中,最容易理解的例子就是微信公眾號(hào)。我們用微信訂閱的微信公共號(hào)就是這里所說的主題,而我們 每一個(gè)關(guān)注這個(gè)微信號(hào)的人就是這里的觀察者。公眾號(hào)每天有更新,所有訂閱者都會(huì)收到。

觀察者模式類圖:

應(yīng)用場(chǎng)景 

         一般被用來(lái)實(shí)現(xiàn)事件處理系統(tǒng)。

觀察者模式組成


        從定義看,可以分成兩個(gè)角色, 觀察者和被觀察對(duì)象(即主題)

        從類圖看,代碼實(shí)現(xiàn)有四個(gè)角色:

  • 抽象主題角色: 把所有對(duì)觀察者對(duì)象的引用保存在一個(gè)集合中,每個(gè)抽象主題角色都可以有任意數(shù)量的觀察者。抽象主題提供一個(gè)接口,可以增加和刪除觀察者角色。一般用一個(gè)抽象類和接口來(lái)實(shí)現(xiàn)。

  • 抽象觀察者角色:為所有具體的觀察者定義一個(gè)接口,在得到主題的通知時(shí)更新自己。

  • 具體主題角色:在具體主題內(nèi)部狀態(tài)改變時(shí),給所有登記過的觀察者發(fā)出通知。具體主題角色通常用一個(gè)子類實(shí)現(xiàn)。

  • 具體觀察者角色:該角色實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。通常用一個(gè)子類實(shí)現(xiàn)。如果需要,具體觀察者角色可以保存一個(gè)指向具體主題角色的引用。


代碼實(shí)現(xiàn)觀察者模式

  • 抽象主題角色

     主題接口規(guī)定了具體主題需要實(shí)現(xiàn)的添加,刪除及通知觀察者更新數(shù)據(jù)的方法

/**
 * 抽象主題,被觀察者
 *
 */
public interface Subject {
 /**
  * 添加觀察者
  * 
  * @param observer
  */
 void addObserver(Observer observer);
 
 /**
  * 移除指定的觀察者
  * 
  * @param observer
  */
 void removeObserver(Observer observer);
 
 /**
  * 移除所有的觀察者
  */
 void removeAll();
 
 /**
  * data 是要通知給觀察者的數(shù)據(jù) 因?yàn)镺bject是所有類的父類,可以使用多態(tài),當(dāng)然 你也可以使用 泛型
  * 
  * @param data
  */
 void notifyAllObserver(Object data);
 
 /**
  * 單獨(dú) 通知某一個(gè)觀察者
  * 
  * @param observer
  * @param data
  *   data 是要通知給觀察者的數(shù)據(jù) 因?yàn)镺bject是所有類的父類,可以使用多態(tài),當(dāng)然 你也可以使用 泛型
  */
 void notify(Observer observer, Object data);
 
}
  • 抽象觀察者角色

        觀察者接口規(guī)定了具體觀察者用來(lái)更新數(shù)據(jù)的方法

/**
 * 抽象觀察者接口
 */
public interface Observer {
 /**
  * 
  * @param subject 被觀察者
  * @param data 被觀察者傳遞給觀察者的 數(shù)據(jù)
  */
 void update(Subject subject,Object data);
}
  • 具體主題角色
public class ConcreteSubject implements Subject {
 
 //觀察者集合,用于管理所有的觀察者
 List<Observer> mList = new ArrayList<>();
 
 @Override
 public void addObserver(Observer observer) {
  // TODO Auto-generated method stub
  // 確保相同的觀察者只含有一個(gè)
  if (observer == null) {
   throw new NullPointerException("observer == null");
  }
 
  if (!mList.contains(observer)) {
   mList.add(observer);
  }
 }
 
 @Override
 public void removeObserver(Observer observer) {
  // TODO Auto-generated method stub
  mList.remove(observer);
 }
 
 @Override
 public void removeAll() {
  // TODO Auto-generated method stub
  mList.clear();
 }
 
 @Override
 public void notifyAllObserver(Object data) {
  // TODO Auto-generated method stub
  for (Observer observer : mList) {
   observer.update(this, data);
  }
 }
 
 @Override
 public void notify(Observer observer, Object data) {
  // TODO Auto-generated method stub
  if (observer != null) {
   observer.update(this, data);
  }
 }
 
}
  • 具體的觀察者角色

       這里我們可以定義多個(gè)具體的觀察者角色

觀察者One

public class ObserverOne implements Observer {
 
 @Override
 public void update(Subject subject, Object data) {
  // TODO Auto-generated method stub
  System.err
    .println("the messge from subject to-->" + this.getClass().getName() + "<---is " + data.toString());
 }
 
}

觀察者Two

public class ObserverTwo implements Observer {
 
 @Override
 public void update(Subject subject, Object data) {
  // TODO Auto-generated method stub
  System.err
  .println("the messge from subject to-->" + this.getClass().getName() + "<---is " + data.toString());
 }
 
}

觀察者Three

public class ObserverThree implements Observer {
 
 @Override
 public void update(Subject subject, Object data) {
  // TODO Auto-generated method stub
  System.err
  .println("the messge from subject to-->" + this.getClass().getName() + "<---is " + data.toString());
 }
 
}
  • 測(cè)試類
public class TestObservePattern {
 
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  ConcreteSubject concreteSubject = new ConcreteSubject();
  ObserverOne observerOne=new ObserverOne();
  ObserverTwo observerTwo=new ObserverTwo();
  ObserverThree observerThree=new ObserverThree();
  
  concreteSubject.addObserver(observerOne);
  concreteSubject.addObserver(observerTwo);
  concreteSubject.addObserver(observerThree);
  
  
  //通知所有的觀察者
  concreteSubject.notifyAllObserver("wake up,wake up");
  //通知某個(gè)特定的觀察者OberverTwo
  concreteSubject.notify(observerTwo, "Specila msg for you");
  //觀察者ObserveThree 決定不再訂閱主題
  concreteSubject.removeObserver(observerThree);
  //通知所有的觀察者
  concreteSubject.notifyAllObserver("new Message come ");
 }
 
}

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Spring事務(wù)管理配置文件問題排查

    Spring事務(wù)管理配置文件問題排查

    這篇文章主要介紹了Spring事務(wù)管理配置文件問題排查,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Struts2在打包json格式的懶加載異常問題

    Struts2在打包json格式的懶加載異常問題

    這篇文章主要為大家詳細(xì)介紹了Struts2在打包json格式的懶加載異常問題,感興趣的小伙伴們可以參考一下
    2016-06-06
  • SpringMvc向request域中設(shè)置數(shù)據(jù)的方法

    SpringMvc向request域中設(shè)置數(shù)據(jù)的方法

    這篇文章主要介紹了SpringMvc向request域中設(shè)置數(shù)據(jù)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • java連接zookeeper實(shí)現(xiàn)zookeeper教程

    java連接zookeeper實(shí)現(xiàn)zookeeper教程

    這篇文章主要介紹了java連接zookeeper實(shí)現(xiàn)zookeeper教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java TimedCache 帶時(shí)間緩存工具類詳解使用

    Java TimedCache 帶時(shí)間緩存工具類詳解使用

    工具類是包含集合框架、遺留的 collection 類、事件模型、日期和時(shí)間設(shè)施、國(guó)際化和各種實(shí)用工具類(字符串標(biāo)記生成器、隨機(jī)數(shù)生成器和位數(shù)組、日期Date類、堆棧Stack類、向量Vector類等)。集合類、時(shí)間處理模式、日期工具等各類常用工具包,本文將介紹帶時(shí)間緩存工具類
    2021-10-10
  • Java集合框架源碼分析之LinkedHashMap詳解

    Java集合框架源碼分析之LinkedHashMap詳解

    這篇文章主要介紹了Java集合框架源碼分析之LinkedHashMap詳解,內(nèi)容包括了linkedhashmap的簡(jiǎn)介和源碼剖析以及關(guān)于LinkedHashMap的源碼總結(jié),內(nèi)容豐富,需要的朋友可以參考下。
    2017-09-09
  • Java的Hello World詳解

    Java的Hello World詳解

    當(dāng)我們學(xué)習(xí)一門編程語(yǔ)言的時(shí)候,我們都會(huì)先學(xué)如何輸出Hello World!本文通過幾個(gè)例子給大家介紹輸出Hello World的代碼,感興趣的朋友一起看看吧
    2021-09-09
  • java跨域cookie失效問題及解決

    java跨域cookie失效問題及解決

    文章介紹了現(xiàn)代Web應(yīng)用中前后端分離架構(gòu)下跨域請(qǐng)求和Cookie處理的問題,包括現(xiàn)象描述、跨域Cookie的原理、解決方案(如Java后端、前端Vue、Nginx配置,以及使用window.localStorage存儲(chǔ)數(shù)據(jù)),以及實(shí)踐案例和常見問題排查
    2025-01-01
  • Java集合中的TreeMap解讀

    Java集合中的TreeMap解讀

    這篇文章主要介紹了Java集合中的TreeMap解讀,TreeMap可以傳入一個(gè)實(shí)現(xiàn)了 Comparator接口的一個(gè)匿名內(nèi)部類,匿名內(nèi)部類里面我們?nèi)匀豢梢匀ブ付ㄌ砑游覀兊逆I值對(duì)的這種排序規(guī)則,需要的朋友可以參考下
    2023-09-09
  • springboot+HttpInvoke?實(shí)現(xiàn)RPC調(diào)用的方法

    springboot+HttpInvoke?實(shí)現(xiàn)RPC調(diào)用的方法

    RPC框架大家或多或少都用過,出自于阿里系的就有dubbo,HSF,sofaRPC等,今天通過本文給大家介紹springboot+HttpInvoke?實(shí)現(xiàn)RPC調(diào)用的方法,感興趣的朋友一起看看吧
    2022-03-03

最新評(píng)論

靖西县| 罗定市| 奉贤区| 周宁县| 临沧市| 琼结县| 商城县| 嘉禾县| 高密市| 枞阳县| 武陟县| 霍邱县| 和龙市| 四会市| 左贡县| 绥滨县| 德令哈市| 车险| 始兴县| 岢岚县| 龙海市| 镇康县| 和平区| 东至县| 神农架林区| 安吉县| 木里| 博湖县| 宁都县| 泸定县| 耿马| 岳普湖县| 恩平市| 浠水县| 赤峰市| 斗六市| 山西省| 太谷县| 偏关县| 密山市| 岳阳市|