活到老,學(xué)到老

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            9 Posts :: 1 Stories :: 2 Comments :: 0 Trackbacks

              概念:觀察者模式定義了一對(duì)多依賴,這樣一來(lái),當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),它的所有依賴者都會(huì)收到通知并自動(dòng)更新。

              舉個(gè)網(wǎng)上商城的例子,比如很多顧客對(duì)某個(gè)商品感興趣,把商品收藏,當(dāng)該商品降價(jià)、促銷(xiāo)、有貨了等事件發(fā)生時(shí),就會(huì)發(fā)Email通知顧客。

              
          UML圖如下:
              

              ItemObserver的代碼如下:
              

          public interface ItemObserver {
              
          void
           sendNotification(String message);
          }

              Customer代碼如下:
              
          public class Customer implements ItemObserver {
              
          private
           String username;
              
          private
           String email;
              
          private
           String mobile;

              
          public Customer(String name) throws IllegalArgumentException 
          {
                  
          if (name == null || "".equals(name)) 
          {
                      
          throw new IllegalArgumentException("username cannot be empty!"
          );
                  }

                  
          this.username = name;
              }


              @Override
              
          public void sendNotification(String message) {
                  
          if (email != null && !"".equals(email.trim())) 
          {
                      System.out.println(
          "Send Email to " +
           username);
                      System.out.println(message);
                  }


                  
          if (mobile != null && !"".equals(mobile.trim())) {
                      System.out.println(
          "Send SMS to " +
           username);
                      System.out.println(message);
                  }

              }


              
          public String getUsername() {
                  
          return
           username;
              }


              
          public void setUsername(String username) {
                  
          this.username =
           username;
              }


              
          public String getEmail() {
                  
          return
           email;
              }


              
          public void setEmail(String email) {
                  
          this.email =
           email;
              }


              
          public String getMobile() {
                  
          return
           mobile;
              }


              
          public void setMobile(String mobile) {
                  
          this.mobile =
           mobile;
              }


              @Override
              
          public boolean equals(Object obj) {
                  
          if (obj == null
          )
                      
          return false
          ;
                  
          if (obj instanceof Customer) 
          {
                      Customer customer 
          =
           (Customer) obj;
                      
          return
           customer.getUsername().equals(username);
                  }
           else {
                      
          return false
          ;
                  }

              }


          }

              ItemObservable代碼如下:
              
          public interface ItemObservable {
              
          void
           registerItemObserver(ItemObserver itemObserver);

              
          void
           removeItemObserver(ItemObserver itemObserver);

              
          void
           notifyObserver(String message);
          }

              Item代碼如下:
              
          public class Item implements ItemObservable {

              
          private
           String             name;
              
          private double
                       price;

              
          private List<ItemObserver> itemObservers = new ArrayList<ItemObserver>
          ();

              
          public Item(String name, double price) 
          {
                  
          this.name =
           name;
                  
          this.price =
           price;
              }


              @Override
              
          public void registerItemObserver(ItemObserver itemObserver) {
                  itemObservers.add(itemObserver);
              }


              @Override
              
          public void removeItemObserver(ItemObserver itemObserver) {
                  itemObservers.remove(itemObserver);
              }


              @Override
              
          public void notifyObserver(String message) {
                  
          for (ItemObserver observer : itemObservers) 
          {
                      observer.sendNotification(message);
                  }

              }


              
          public void changePrice(double changedPrice) {
                  price 
          +=
           changedPrice;
                  
          if (changedPrice < 0
          {
                      notifyObserver(name 
          + " 降價(jià)了!"
          );
                  }

              }

              另外:Java的util包提供了Observer接口和Observable接口支持這個(gè)模式。
          posted on 2011-04-07 22:29 simon.shen 閱讀(334) 評(píng)論(1)  編輯  收藏 所屬分類: 設(shè)計(jì)模式

          Feedback

          # re: 觀察者模式 2011-04-08 09:25 晴天
          感覺(jué)例子不是特別好~~  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
          相關(guān)文章:
           
          主站蜘蛛池模板: 霍邱县| 扎囊县| 双流县| 武义县| 沙坪坝区| 永昌县| 宁明县| 西充县| 长宁区| 陇川县| 海安县| 封开县| 城市| 杭州市| 英德市| 陇川县| 莎车县| 龙南县| 新野县| 新密市| 夏津县| 长汀县| 远安县| 惠安县| 伊川县| 阿拉善左旗| 韶关市| 抚州市| 通州区| 从江县| 璧山县| 内乡县| 滦平县| 通许县| 塔城市| 秭归县| 华亭县| 南靖县| 宾阳县| 临洮县| 凤城市|