活到老,學到老

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            9 Posts :: 1 Stories :: 2 Comments :: 0 Trackbacks

              概念:觀察者模式定義了一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知并自動更新。

              舉個網上商城的例子,比如很多顧客對某個商品感興趣,把商品收藏,當該商品降價、促銷、有貨了等事件發生時,就會發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 
          + " 降價了!"
          );
                  }

              }

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

          Feedback

          # re: 觀察者模式 2011-04-08 09:25 晴天
          感覺例子不是特別好~~  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 阿合奇县| 乌审旗| 泰州市| 陆良县| 庆云县| 武强县| 海晏县| 肥东县| 拜泉县| 普宁市| 措美县| 靖州| 资溪县| 博湖县| 卓尼县| 教育| 井陉县| 大同市| 肥乡县| 巴林右旗| 平舆县| 建瓯市| 稷山县| 张掖市| 同心县| 龙陵县| 山东省| 怀柔区| 长白| 汕尾市| 青阳县| 织金县| 奈曼旗| 咸阳市| 长春市| 滁州市| 绵阳市| 靖江市| 桓台县| 揭西县| 甘肃省|