可能就是所謂的觀察者模式

來源:互聯網
上載者:User

直接崩潰了,看了好長時間才明白一點其中的意思,先初次記錄一下,等有更深層次的理解時再繼續編輯。

在《Head.First設計模式》中,對觀察者模式的解釋非常生動,理解起來也很容易,但是,真正自己寫一個實現為什麼怎麼就這麼難呢?哎……好吧,記錄一下主要的學習內容。

一、觀察者模式引入

首先,說一下這個被稱為皇后的觀察者模式:觀察者模式定義了一系列對象之間的一對多依賴關係;當一個對象改變狀態,其他依賴者都會收到通知並自動更新。其中,“一”指的是主題,“多”指的是觀察者。觀察者可以“註冊”後獲得“主題”改變時的及時通知。

如果還不是很好理解,我們繼續:比如有讀者樂樂、皮皮、大皮皮、破皮。出版社發放報紙,四位讀者可以訂閱。如果樂樂想訂閱,那麼,他會告訴出版商,我要訂閱報紙,之後,出版社一有新的報紙出來的時候,就會及時發放到樂樂手中。同理,皮皮想訂閱的話,也可以這樣。如果訂閱一段時間後,樂樂不想訂了,可以直接告訴出版商,我不訂閱了,這樣,之後的資訊更新就不會再通知給樂樂。      觀察者模式就是這樣一個過程,可以靈活的接受對象的“註冊”,也可以允許使用者物件“登出”。“註冊”的使用者可以及時得到主題對象的更新內容,而沒有訂閱的就不能得到。

下面是類圖:

二、觀察者模式設計舉例

實現功能:學校發布資訊,學生可以訂閱,老師可以訂閱,行政人員也可以訂閱。

思路:定義主題介面,觀察者介面,定義Notice 、學生、老師和行政人員類,定義測試類別。其中Notice類實現主題介面,老師、學生和行政人員實現觀察者介面。

實現過程:(注釋中有解釋)

1、定義主題介面

Code:
  1. public interface Subjects{   
  2. //註冊訂閱使用者   
  3. public void registerObservers(Observer o);   
  4. //對使用者發送新的通知   
  5. public void notifyObservers();   
  6. //登出使用者   
  7. public void removeObservers(Observer o);   
  8. }  

2、定義觀察者介面

Code:
  1. public interface Observer{   
  2. //notice通過調用此方法實現向訂閱者發送資訊的功能   
  3. public void givenotice(String s);   
  4. }  

3、定義Notice類

Code:
  1. import java.util.ArrayList;       
  2. //實現主題介面       
  3. public class Notice implements Subjects{       
  4.       
  5. private String ss = new String();       
  6. private ArrayList observers;       
  7. public Notice(){       
  8. observers = new ArrayList();       
  9. }    
  10. //主題介面方法,登出訂閱使用者   
  11. public void removeObservers(Observer o){   
  12. int i = observers.indexOf(o);   
  13. if (i>=0){   
  14. observers.remove(i);   
  15. }   
  16. }      
  17. //主題介面方法,添加訂閱的使用者       
  18. public void registerObservers (Observer o){       
  19. observers.add(o);       
  20. }       
  21. //主題介面方法,通過遍曆向訂閱者發送訊息       
  22. public void notifyObservers(){       
  23. for (int i=0; i<observers.size();i++){       
  24. Observer observer = (Observer)observers.get(i);       
  25. observer.givenotice(ss);       
  26. }       
  27. }       
  28. //供測試用       
  29. public void setContent(String ss){       
  30. this.ss = ss;             
  31. this.notifyObservers();       
  32. }       
  33. }      

4、定義Student類

Code:
  1. public class Student implements Observer{   
  2. //實現Observer的方法   
  3. public void givenotice(String ss){   
  4.   
  5. System.out.println("學生:"+ss);   
  6. }   
  7. }  

5、再定義一個Teacher類

Code:
  1. public class Teacher implements Observer{   
  2.   
  3. //實現observers中的givenotice()方法   
  4. public void givenotice(String ss){   
  5.   
  6. System.out.println("老師:"+ss);   
  7.   
  8. }   
  9. }  

6、用Test類實現測試

Code:
  1. public class Test{   
  2. //這是測試   
  3. public static void main(String args[]){   
  4. Notice n = new Notice();   
  5. Student student = new Student();   
  6. Teacher teacher = new Teacher();   
  7. n.registerObservers(student);   
  8. n.registerObservers(teacher); 
  9.   
  10. //因為沒有可以自動調用Notice中的方法的實現,所以,只好通過這個測試了   
  11. n.setContent("ahaha"); 
  12. //登出student使用者  
  13. n.removeObservers(student);
    n.setContent("ahaha");
  14. }   
  15. }  

7、輸出結果

學生:ahaha
老師:ahaha
老師:ahaha(登出student後)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.