国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java設計模式之觀(guān)察者模式(Observer模式)

發(fā)布時(shí)間:2021-07-17 21:51 來(lái)源:腳本之家 閱讀:0 作者:夢(mèng)青塵 欄目: 編程語(yǔ)言

目錄

      一、觀(guān)察者模式是什么?

      當對象間存在一對多關(guān)系時(shí),則使用觀(guān)察者模式(Observer Pattern)。當一個(gè)對象被修改時(shí),則會(huì )自動(dòng)通知依賴(lài)它的對象。觀(guān)察者模式屬于行為型模式。

      人話(huà): 就像微信公眾號推送消息,訂閱的人能收到,沒(méi)訂閱的收不到,還可以取消/添加訂閱

      二、模式分析

      2.1 四個(gè)角色

      • 抽象主題(抽象被觀(guān)察者角色):也就是一個(gè)抽象主題,它把所有對觀(guān)察者對象的引用保存在一個(gè)集合中,每個(gè)主題都可以有任意數量的觀(guān)察者。抽象主題提供一個(gè)接口,可以增加和刪除觀(guān)察者角色。一般用一個(gè)抽象類(lèi)和接口來(lái)實(shí)現。
      • 抽象觀(guān)察者角色:為所有的具體觀(guān)察者定義一個(gè)接口,在得到主題通知時(shí)更新自己。
      • 具體主題(具體被觀(guān)察者角色):也就是一個(gè)具體的主題,在集體主題的內部狀態(tài)改變時(shí),所有登記過(guò)的觀(guān)察者發(fā)出通知。
      • 具體觀(guān)察者角色:實(shí)現抽象觀(guān)察者角色所需要的更新接口,一邊使本身的狀態(tài)與制圖的狀態(tài)相協(xié)調。

      2.2 案例

      • 微信公眾號

      1.抽象主題

      public interface  Subject {
      
          /**
           * 注冊觀(guān)察者
           */
          void registerObserver(observer observer);
      
          /**
           * 移除觀(guān)察者
           */
          void removeObserver(observer observer);
      
          /**
           * 通知觀(guān)察者
           */
          void notifyObservers();
      
      }
      
      

      2.抽象觀(guān)察者角色

      public interface observer {
          /**
           * 更新
           */
          void update(String message);
      }

      3.具體主題

      用Vector是線(xiàn)程同步的,比較安全,也可以使用ArrayList,是線(xiàn)程異步的,但不安全。

      public class WechatServer implements Subject{
          //注意到這個(gè)List集合的泛型參數為Observer接口,設計原則:面向接口編程而不是面向實(shí)現編程
          private Vector<observer> list;
          private String message;
      
          public WechatServer() {
              list = new Vector<observer>();
          }
          @Override
          public void registerObserver(observer observer) {
              list.add(observer);
          }
      
          @Override
          public void removeObserver(observer observer) {
              if(!list.isEmpty())
                  list.remove(observer);
          }
      
          @Override
          public void notifyObservers() {
              for(int i = 0; i < list.size(); i++) {
                  observer oserver = list.get(i);
                   oserver.update(message);
              }
          }
      
          public void setInfomation(String s) {
              this.message = s;
              System.out.println("微信服務(wù)更新消息: " + s);
              //消息更新,通知所有觀(guān)察者
              notifyObservers();
          }
      }
      

      4.具體觀(guān)察者角色

      public class User implements observer {
          private String name;
          private String message;
      
          public User(String name) {
              this.name = name;
          }
      
          @Override
          public void update(String message) {
              this.message = message;
              read();
          }
      
          public void read() {
              System.out.println(name + " 收到推送消息: " + message);
          }
      }
      

      5.測試類(lèi)

      public class Test {
          public static void main(String[] args) {
              //主題
              WechatServer server = new WechatServer();
      
              //觀(guān)察者
              observer userZhang = new User("ZhangSan");
              observer userLi = new User("LiSi");
              observer userWang = new User("WangWu");
              
              server.registerObserver(userZhang);
              server.setInfomation("C是世界上最好用的語(yǔ)言!");
              System.out.println("====================================");
              server.registerObserver(userLi);
              server.registerObserver(userWang);
              server.setInfomation("JAVA是世界上最好用的語(yǔ)言!");
      
          }
      }
      

      6.結果


      三、觀(guān)察者模式的優(yōu)缺點(diǎn)

      優(yōu)點(diǎn)

      解除耦合,讓耦合的雙方都依賴(lài)于抽象,從而使得各自的變換都不會(huì )影響另一邊的變換。

      缺點(diǎn)

      在應用觀(guān)察者模式時(shí)需要考慮一下開(kāi)發(fā)效率和運行效率的問(wèn)題,程序中包括一個(gè)被觀(guān)察者、多個(gè)觀(guān)察者,開(kāi)發(fā)、調試等內容會(huì )比較復雜,而且在Java中消息的通知一般是順序執行,那么一個(gè)觀(guān)察者卡頓,會(huì )影響整體的執行效率,在這種情況下,一般會(huì )采用異步實(shí)現。

      四、總結

      當一個(gè)對象的改變需要同時(shí)改變其它對象,并且它不知道具體有多少對象有待改變的時(shí)候,應該考慮使用觀(guān)察者模式。 而使用觀(guān)察者模式的動(dòng)機在于:將一個(gè)系統分割成一系列相互協(xié)作的類(lèi)有一個(gè)很不好的副作用,就是需要維護相關(guān)對象間的一致性,我們不希望為了維持一致性而使各類(lèi)緊密耦合,這樣會(huì )給維護、擴展和重用都帶來(lái)不便,而觀(guān)察者模式所做的工作就是在解除耦合。

      到此這篇關(guān)于Java設計模式之觀(guān)察者模式(Observer模式)的文章就介紹到這了,更多相關(guān)Java觀(guān)察者模式內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

      免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

      少妇激情AV一区二区三区| 亚洲AV网址在线观看| 亚洲AV无码一区二区二三区入口| 天天澡天天揉揉AV无码| 男男GAY啪啪网站18禁| 日韩午夜无码A级毛片|