真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

這篇文章主要用代碼詳解Java設(shè)計模式之觀察者模式原理與用法,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的天河網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

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

什么是觀察者模式


      可以這么理解:

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

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

    也可以這樣理解:

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

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


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

觀察者模式類圖:

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

應(yīng)用場景 

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

觀察者模式組成


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

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

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

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

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

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


代碼實(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ú) 通知某一個觀察者
  * 
  * @param observer
  * @param data
  *   data 是要通知給觀察者的數(shù)據(jù) 因?yàn)镺bject是所有類的父類,可以使用多態(tài),當(dāng)然 你也可以使用 泛型
  */
 void notify(Observer observer, Object data);
 
}
  • 抽象觀察者角色

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

/**
 * 抽象觀察者接口
 */
public interface Observer {
 /**
  * 
  * @param subject 被觀察者
  * @param data 被觀察者傳遞給觀察者的 數(shù)據(jù)
  */
 void update(Subject subject,Object data);
}
  • 具體主題角色
public class ConcreteSubject implements Subject {
 
 //觀察者集合,用于管理所有的觀察者
 List mList = new ArrayList<>();
 
 @Override
 public void addObserver(Observer observer) {
  // TODO Auto-generated method stub
  // 確保相同的觀察者只含有一個
  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);
  }
 }
 
}
  • 具體的觀察者角色

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

觀察者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());
 }
 
}
  • 測試類
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");
  //通知某個特定的觀察者OberverTwo
  concreteSubject.notify(observerTwo, "Specila msg for you");
  //觀察者ObserveThree 決定不再訂閱主題
  concreteSubject.removeObserver(observerThree);
  //通知所有的觀察者
  concreteSubject.notifyAllObserver("new Message come ");
 }
 
}

看完上述內(nèi)容,是不是對用代碼詳解Java設(shè)計模式之觀察者模式原理與用法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


本文題目:用代碼詳解Java設(shè)計模式之觀察者模式原理與用法
網(wǎng)頁URL:http://weahome.cn/article/pjsjos.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部