亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

爪哇語言觀察者模式介紹

2019-11-18 12:16:26
字體:
來源:轉載
供稿:網友

  簡單地說,觀察者模式定義了一個一對多的依靠關系,讓一個或多個觀察者對象監察一個主題對象。這樣一個主題對象在狀態上的變化能夠通知所有的依靠于此對象的那些觀察者對象,使這些觀察者對象能夠自動更新。
  觀察者模式的結構
  觀察者(Observer)模式是對象的行為型模式,又叫做發表-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-收聽者(Source/Listener)模式或從屬者(Dependents)模式。
  本模式的類圖結構如下:
   爪哇語言觀察者模式介紹(圖一)


  圖1、觀察者模式的靜態結構可從類圖中看清楚。 
  在觀察者模式里有如下的角色:
  . 抽象主題(Subject)角色:主題角色把所有的觀察者對象的引用保存在一個列表里;每個主題都可以有任何數量的觀察者。主題提供一個接口可以加上或撤銷觀察者對象;主題角色又叫做抽象被觀察者(Observable)角色;
   爪哇語言觀察者模式介紹(圖二)
  圖2、抽象主題角色,有時又叫做抽象被觀察者角色,可以用一個抽象類或者一個接口實現;在具體的情況下也不排除使用具體類實現?!?br />  . 抽象觀察者(Observer)角色:為所有的具體觀察者定義一個接口,在得到通知時更新自己;
   爪哇語言觀察者模式介紹(圖三)
  圖3、抽象觀察者角色,可以用一個抽象類或者一個接口實現;在具體的情況下也不排除使用具體類實現。 
  . 具體主題(ConcreteSubject)角色:保存對具體觀察者對象有用的內部狀態;在這種內部狀態改變時給其觀察者發出一個通知;具體主題角色又叫作具體被觀察者角色;
   爪哇語言觀察者模式介紹(圖四)
  圖4、具體主題角色,通常用一個具體子類實現?!?br /> ?。唧w觀察者(ConcreteObserver)角色:保存一個指向具體主題對象的引用;和一個與主題的狀態相符的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新自己的接口,以便使本身的狀態與主題的狀態自恰。
   爪哇語言觀察者模式介紹(圖五)
  圖5、具體觀察者角色,通常用一個具體子類實現?!?br />  下面給出一個示意性實現的java代碼。首先在這個示意性的實現里,用一個Java接口實現抽象主題角色,這就是下面的Subject接口:
  public interface Subject
  {
  public void attach(Observer observer);
  public void detach(Observer observer);
  void notifyObservers();
  }
  代碼清單1、Subject接口的源代碼。
  這個抽象主題接口規定出三個子類必須實現的操作,即 attach() 用來增加一個觀察者對象;detach() 用來刪除一個觀察者對象;和notifyObservers() 用來通知各個觀察者刷新它們自己。抽象主題角色實際上要求子類保持一個以所有的觀察者對象為元素的列表。
  具體主題則是實現了抽象主題Subject接口的一個具體類,它給出了以上的三個操作的具體實現。從下面的源代碼可以看出,這里給出的Java實現使用了一個Java向量來保存所有的觀察者對象,而 attach() 和 detach() 操作則是對此向量的元素增減操作。
  import java.util.Vector;
  import java.util.Enumeration;
  public class ConcreteSubject implements Subject
  public void attach(Observer observer)
  {
  observersVector.addElement(observer);
  }
  public void detach(Observer observer)
  {
  observersVector.removeElement(observer);
  }
  public void notifyObservers()
  {
  Enumeration enumeration = observers();
  while (enumeration.hasMoreElements())
  {
  ((Observer)enumeration.nextElement()).update();
  }
  }
  public Enumeration observers()
  {
  return ((Vector) observersVector.clone()).elements();
  }
  PRivate Vector observersVector = new java.util.Vector();
  }
  代碼清單2、ConcreteSubject類的源代碼。
  抽象觀察者角色的實現實際上是最為簡單的一個,它是一個Java接口,只聲明了一個方法,即update()。這個方法被子類實現后,一被調用便刷新自己。
  public interface Observer
  {
  void update();
  }
  代碼清單3、Observer接口的源代碼。
  具體觀察者角色的實現其實只涉及update()方法的實現。這個方法怎么實現與應用密切相關,因此本類只給出一個框架。
  public class ConcreteObserver implements Observer
  {
  public void update()
  {
  // Write your code here
  }
  }
  代碼清單4、ConcreteObserver類的源代碼。
  雖然觀察者模式的實現方法可以有設計師自己確定,但是因為從AWT1.1開始視窗系統的事件模型采用觀察者模式,因此觀察者模式在Java語言里的地位較為重要。正因為這個原因,Java語言給出了它自己對觀察者模式的支持。因此,本文建議讀者在自己的系統中應用觀察者模式時,不妨利用Java語言所提供的支持。
  Java語言提供的對觀察者模式的支持
  在Java語言的java.util庫里面,提供了一個Observable類以及一個Observer接口,構成Java語言對觀察者模式的支持。
  Observer接口
  這個接口只定義了一個方法,update()。當被觀察者對象的狀態發生變化時,這個方法就會被調用。這個方法的實現應當調用每一個被觀察者對象的notifyObservers()方法,從而通知所有的觀察對象。
   爪哇語言觀察者模式介紹(圖六)
  圖6、java.util提供的Observer接口的類圖?!?br />  package java.util;
  public interface Observer
  {
  /**
  * 當被觀察的對象發生變化時,這個方法會被調用。
  */
  void update(Observable o, Object arg);
  }
  代碼清單5、java.util.Observer接口的源代碼。
  Observable類
  被觀察者類都是java.util.Observable類的子類。java.util.Observable提供公開的方法支持觀察者對象,這些方法中有兩個對Observable的子類非常重要:一個是setChanged(),另一個是notifyObservers()。第一個方法setChanged()被調用之后會設置一個內部標記變量,代表被觀察者對象的狀態發生了變化。第二個是notifyObservers(),這個方法被調用時,會調用所有登記過的觀察者對象的update()方法,使這些觀察者對象可以更新自己。
  java.util.Observable類還有其它的一些重要的方法。比如,觀察者對象可以調用java.util.Observable類的addObserver()方法,將對象一個一個加入到一個列表上。當有變化時,這個列表可以告訴notifyObservers()方法那些觀察者對象需要通知。由于這個列表是私有的,因此java.util.Observable的子對象并不知道觀察者對象一直在觀察著它們。
   爪哇語言觀察者模式介紹(圖七)
  圖7、Java語言提供的被觀察者的類圖?!?br />  被觀察者類Observable的源代碼:
  package java.util;
  public class Observable
  {
  private boolean changed = false;
  private Vector obs;
  /** 用0個觀察者構造一個被觀察者。**/
  
  public Observable()
  {
  obs = new Vector();
  }
  /**
  * 將一個觀察者加到觀察者列表上面。
  */
  public synchronized void addObserver(Observer o)
  {
  if (!obs.contains(o))
  {
  obs.addElement(o);
  }
  }
  /**
  * 將一個觀察者對象從觀察者列表上刪除。
  */
  public synchronized void deleteObserver(Observer o)
  {
  obs.removeElement(o);
  }
  /**
  * 相當于 notifyObservers(null)
  */
  public void notifyObservers()
  {
  notifyObservers(null);
  }
  /**
  * 假如本對象有變化(那時hasChanged 方法會返回true)
  * 調用本方法通知所有登記在案的觀察者,即調用它們的update()方法,
  * 傳入this和arg作為參量。
  */
  public void notifyObservers(Object arg)
  {
  /**
  * 臨時存放當前的觀察者的狀態。參見備忘錄模式。
  */
  Object[] arrLocal;
  synchronized (this)
  {
  if (!changed) return;
  arrLocal = obs.toArray();
  clearChanged();
  }
  for (int i = arrLocal.length-1; i>=0; i--)
  ((Observer)arrLocal[i]).update(this, arg);
  }
  /**
  * 將觀察者列表清空
  */
  public synchronized void deleteObservers()
  {
  obs.removeAllElements();
  }
  /**
  * 將“已變化”設為true
  */
  protected synchronized void setChanged()
  {
  changed = true;
  }
  /**
  * 將“已變化”重置為false
  */
  protected synchronized void clearChanged()
  {
  changed = false;
  }
  /**
  * 探測本對象是否已變化
  */
  public synchronized boolean hasChanged()
  {
  return changed;
  }
  /**
  * 返還被觀察對象(即此對象)的觀察者總數。
  */
  public synchronized int countObservers()
  {
  return obs.size();
  }
  }
  代碼清單

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产自产在线观看永久| www.亚洲人.com| 亚洲精品成人久久| 欧美午夜片在线免费观看| 久久在线观看视频| 精品一区精品二区| 91av视频在线播放| 欧美性猛交xxxxx水多| 91av在线网站| 久久精品一偷一偷国产| 欧美日韩色婷婷| 日av在线播放中文不卡| 亚洲福利在线视频| 亚洲精品成人久久| 在线播放国产精品| 91精品国产自产在线观看永久| 国产精品入口夜色视频大尺度| 欧美综合在线第二页| 欧美电影免费观看网站| 亚洲欧美日韩在线高清直播| www.亚洲一区| 亚洲二区在线播放视频| 国产精品久久久久久久久久三级| 中文字幕久热精品视频在线| 欧美激情精品久久久久久| 欧美色道久久88综合亚洲精品| 亚洲女人初尝黑人巨大| 国产精品久久久久久久久久免费| 国产精品高清网站| 97免费视频在线| 国产欧美va欧美va香蕉在线| 亚洲国产欧美自拍| 亚洲人成电影在线观看天堂色| 亚洲第一免费播放区| 久久久www成人免费精品| 欧美日韩亚洲成人| 国产精品专区第二| 亚洲影院色在线观看免费| 欧美精品18videosex性欧美| 日韩中文字幕在线视频| 亚洲一区美女视频在线观看免费| 欧美精品一二区| 欧美一级片在线播放| 精品久久久久久中文字幕大豆网| 日本电影亚洲天堂| 欧美日韩精品在线视频| 尤物yw午夜国产精品视频明星| 亚洲欧美综合v| 亚洲国产精品国自产拍av秋霞| 精品国产91乱高清在线观看| 亚洲成av人乱码色午夜| 国产欧美韩国高清| 国产成人福利视频| 亚洲一区二区三区视频| 亚洲精品成a人在线观看| 成人午夜小视频| 久久久伊人欧美| 91久久精品国产91性色| 国产精品igao视频| 国产精品国产三级国产专播精品人| 韩国精品美女www爽爽爽视频| 国产美女久久精品| 黄色精品在线看| 日韩激情视频在线播放| 亚州av一区二区| 一区二区三区视频在线| 国产欧美一区二区三区久久| 亚洲图片在区色| 亚洲乱亚洲乱妇无码| 九九久久精品一区| 高清欧美性猛交xxxx黑人猛交| 中文字幕亚洲精品| 欧美性少妇18aaaa视频| 91免费视频网站| 久久精品99久久久久久久久| 色多多国产成人永久免费网站| 黑人巨大精品欧美一区免费视频| 在线电影欧美日韩一区二区私密| 日韩视频永久免费观看| 国产精品电影在线观看| 中文字幕在线看视频国产欧美在线看完整| 日韩高清免费观看| 亲子乱一区二区三区电影| 欧美日韩在线观看视频| 亚洲精品之草原avav久久| 国产成人精品久久亚洲高清不卡| 日韩欧美中文字幕在线播放| 黄色成人在线免费| 中文国产成人精品久久一| 久久免费精品日本久久中文字幕| 中国人与牲禽动交精品| 亚洲福利视频久久| 亚洲精品视频免费| 久久久久中文字幕2018| 国产精品老女人精品视频| 日韩成人在线视频观看| 欧美成人中文字幕在线| 日本久久久久久久| 国产精品成人va在线观看| 欧美丝袜美女中出在线| 日本中文字幕久久看| 欧美午夜片在线免费观看| 97在线免费视频| 中文字幕欧美在线| 久色乳综合思思在线视频| 欧美有码在线视频| 日韩69视频在线观看| 欧美成人在线影院| 久久亚洲一区二区三区四区五区高| 91日本视频在线| 国产欧美日韩精品在线观看| 日韩成人在线播放| 伊人久久综合97精品| 国产精品久久久久久久午夜| 伊人伊人伊人久久| 欧美亚洲免费电影| 国产精品欧美一区二区| 日韩av免费在线播放| 欧美精品情趣视频| 国产日韩欧美在线播放| 成人免费直播live| 最近日韩中文字幕中文| 国产精品久久久久久久久久尿| 中文字幕av一区| 精品久久久在线观看| 2021久久精品国产99国产精品| 久久av中文字幕| 97久久伊人激情网| 亚洲精品av在线| 55夜色66夜色国产精品视频| 久久噜噜噜精品国产亚洲综合| 亚洲精品视频免费在线观看| 91超碰caoporn97人人| 亚洲免费av电影| 亚洲综合国产精品| 日本伊人精品一区二区三区介绍| 欧美日韩国产麻豆| 国产日韩精品在线| 欧美另类69精品久久久久9999| 国产精品久久9| 亚洲网在线观看| 国产精品色婷婷视频| 亚洲午夜小视频| 亚洲人成在线观看| 国产精品视频网| 亚洲综合日韩中文字幕v在线| 欧美久久精品一级黑人c片| 日本a级片电影一区二区| 国产综合色香蕉精品| 91在线免费视频| 这里只有精品在线观看| 久久精品99久久久香蕉| 国产精品久久久久久搜索| 久久成人人人人精品欧| 久久亚洲国产精品| 97久久伊人激情网| 精品久久久一区| 亚洲电影免费观看高清完整版| 国产日韩欧美电影在线观看| 国产精品成av人在线视午夜片| 另类图片亚洲另类| 国语自产精品视频在线看一大j8| 精品国产乱码久久久久久天美| 国产精品视频一区国模私拍|