国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java設計模式開發中使用觀察者模式的實例教程

2019-11-26 14:25:31
字體:
來源:轉載
供稿:網友

觀察者模式是軟件設計模式中的一種,使用也比較普遍,尤其是在GUI編程中。關于設計模式的文章,網絡上寫的都比較多,而且很多文章寫的也不錯,雖然說有一種重復早輪子的嫌疑,但此輪子非彼輪子,側重點不同,思路也不同,講述方式也不近相同。
關鍵要素

主題:

主題是觀察者觀察的對象,一個主題必須具備下面三個特征。

  • 持有監聽的觀察者的引用
  • 支持增加和刪除觀察者
  • 主題狀態改變,通知觀察者

觀察者:

當主題發生變化,收到通知進行具體的處理是觀察者必須具備的特征。

為什么要用這種模式

這里舉一個例子來說明,牛奶送奶站就是主題,訂奶客戶為監聽者,客戶從送奶站訂閱牛奶后,會每天收到牛奶。如果客戶不想訂閱了,可以取消,以后就不會收到牛奶。

松耦合

觀察者增加或刪除無需修改主題的代碼,只需調用主題對應的增加或者刪除的方法即可。
主題只負責通知觀察者,但無需了解觀察者如何處理通知。舉個例子,送奶站只負責送遞牛奶,不關心客戶是喝掉還是洗臉。
觀察者只需等待主題通知,無需觀察主題相關的細節。還是那個例子,客戶只需關心送奶站送到牛奶,不關心牛奶由哪個快遞人員,使用何種交通工具送達。

Java實現觀察者模式
1. Java自帶的實現
類圖

201642494900291.jpg (806×524)

/**  * 觀察目標 繼承自 java.util.Observable  * @author stone  *  */ public class UpdateObservable extends Observable {      private int data;      public UpdateObservable(Observer observer) {     addObserver(observer);     /*      * add other observer      */   }      public int getData() {     return data;   }      public void setData(int data) {     if (data != this.data) {       this.data = data;       setChanged(); //標記 改變, 只有標記后才能通知到       notifyObservers(); //通知     }        }    @Override   public synchronized void addObserver(Observer o) {     super.addObserver(o);   }    @Override   public synchronized void deleteObserver(Observer o) {     super.deleteObserver(o);   }    @Override   public void notifyObservers() {     super.notifyObservers();   }    @Override   public void notifyObservers(Object arg) {     super.notifyObservers(arg);   }    @Override   public synchronized void deleteObservers() {     super.deleteObservers();   }    @Override   protected synchronized void setChanged() {     super.setChanged();   }    @Override   protected synchronized void clearChanged() {     super.clearChanged();   }    @Override   public synchronized boolean hasChanged() {     return super.hasChanged();   }    @Override   public synchronized int countObservers() {     return super.countObservers();   }    } 
/**  * 觀察者 實現 java.util.Observer接口  * @author stone  *  */ public class UpdateObserver implements Observer {    @Override   public void update(Observable o, Object arg) {     System.out.println("接收到數據變化的通知:");     if (o instanceof UpdateObservable) {       UpdateObservable uo = (UpdateObservable) o;       System.out.print("數據變更為:" + uo.getData());     }   }  } 

2. 自定義的觀察模型
類圖

201642494952492.jpg (968×676)

/**  * 抽象觀察者  Observer  * 觀察 更新      * @author stone  *  */ public interface IWatcher {   /*    * 通知接口:    * 1. 簡單通知    * 2. 觀察者需要目標的變化的數據,那么可以將目標用作參數, 見Java的Observer和Observable    */ // void update(IWatched watched);      void update();    } 
/**  * 抽象目標 Subject  * 提供注冊和刪除觀察者對象的接口, 及通知觀察者進行觀察的接口  * 及目標 自身被觀察的業務的接口  * @author stone  *  */ public interface IWatchedSubject {      public void add(IWatcher watch);    public void remove(IWatcher watch);      public void notifyWhatchers();      public void update();//被觀察業務變化的接口 } 
/**  * 具體觀察者    Concrete Observer  *  * @author stone  *  */ public class UpdateWatcher implements IWatcher {    @Override   public void update() {     System.out.println(this + "觀察到:目標已經更新了");   }  } 


/**  * 具體目標角色  Concrete Subject  * @author stone  *  */ public class UpdateWatchedSubject implements IWatchedSubject {   private List<IWatcher> list;      public UpdateWatchedSubject() {     this.list = new ArrayList<IWatcher>();   }      @Override   public void add(IWatcher watch) {     this.list.add(watch);   }    @Override   public void remove(IWatcher watch) {     this.list.remove(watch);   }    @Override   public void notifyWhatchers() {     for (IWatcher watcher : list) {       watcher.update();     }   }      @Override   public void update() {     System.out.println("目標更新中....");     notifyWhatchers();   }  } 


監聽器是觀察者的一種實現:
類圖

201642495137152.jpg (780×502)

/**  * 監聽 用戶在注冊后  * @author stone  *  */ public interface IRegisterListener {   void onRegistered(); } 
/**  * 監聽 當用戶登錄后  * @author stone  *  */ public interface ILoginListener {   void onLogined(); } 
/*  * 監聽器 是觀察者模式的一種實現  * 一些需要監聽的業務接口上添加 監聽器,調用監聽器的相應方法,實現監聽  */ public class User {      public void register(IRegisterListener register) {     /*      * do ... register      */     System.out.println("正在注冊中...");     //注冊后     register.onRegistered();   }    public void login(ILoginListener login) {     /*      * do ... login      */     System.out.println("正在登錄中...");     //登錄后     login.onLogined();   }  } 


/**  * 觀察者(Observer)模式 行為型模式  *  觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時觀察某一個目標對象。  *  這個目標對象在狀態上發生變化時,會通知所有觀察者對象,讓它們能夠自動更新自己  * 目標對象中需要有添加、移除、通知 觀察者的接口  *   * @author stone  */ public class Test {      public static void main(String[] args) {     /*      * 使用Java自帶的Observer接口和Observable類      */     UpdateObservable observable = new UpdateObservable(new UpdateObserver());     observable.setData(99);     System.out.println("");     System.out.println("");     /*      * 自定義的觀察者模型      */     IWatchedSubject watched = new UpdateWatchedSubject();     watched.add(new UpdateWatcher());     watched.add(new UpdateWatcher());     watched.update();     System.out.println("");          /*      * 子模式-監聽器      */          User user = new User();     user.register(new IRegisterListener() {              @Override       public void onRegistered() {         System.out.println("監聽到注冊后。。。");       }     });     user.login(new ILoginListener() {              @Override       public void onLogined() {         System.out.println("監聽到登錄后。。。");       }     });        } } 


打印

接收到數據變化的通知: 數據變更為:99  目標更新中.... observer.UpdateWatcher@457471e0觀察到:目標已經更新了 observer.UpdateWatcher@5fe04cbf觀察到:目標已經更新了  正在注冊中... 監聽到注冊后。。。 正在登錄中... 監聽到登錄后。。。 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 曲靖市| 鲁甸县| 怀安县| 南投县| 绥德县| 昌吉市| 余庆县| 江安县| 琼海市| 海丰县| 北流市| 旬邑县| 南木林县| 榕江县| 渝北区| 文成县| 克什克腾旗| 泰和县| 吉林市| 永宁县| 马山县| 永泰县| 武强县| 长寿区| 延长县| 抚松县| 平邑县| 永州市| 巴彦县| 商城县| 砚山县| 曲松县| 张家川| 安福县| 长岛县| 星子县| 福州市| 和硕县| 乳山市| 尖扎县| 江油市|