活到老,學到老

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

          常用鏈接

          留言簿

          我參與的團隊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

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

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

              }

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

          Feedback

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


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 凤城市| 濉溪县| 祁东县| 买车| 大兴区| 阿克| 武穴市| 无极县| 紫金县| 彝良县| 平度市| 论坛| 新安县| 丰顺县| 龙胜| 清河县| 建平县| 永泰县| 望奎县| 扶绥县| 永丰县| 英山县| 寿光市| 镇江市| 南陵县| 清苑县| 铜川市| 昆明市| 安远县| 衡水市| 佛山市| 临安市| 商洛市| 新密市| 财经| 井冈山市| 堆龙德庆县| 休宁县| 布拖县| 策勒县| 来安县|