觀察者模式

1.       觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。另:當一個對象的改變需要同時改變其他對象的時候,而且它不知道具體有多少對象有待改變時,應該考慮使用觀察者模式。

2.       結構圖


3.       舉例:

A.抽象通知者

  1. public interface Publisher { 
  2.  
  3.     public String state = null
  4.  
  5.     public void register(Observer o); 
  6.  
  7.     public void unregister(Observer o); 
  8.  


B. 抽象觀察者

  1. public abstract class Observer { 
  2.  
  3.         public abstract void update(); 
  4.  


C. 具體通知者

  1. public class ConcretPublisher1 implements Publisher{ 
  2.  
  3. private List<Observer> observerList = new ArrayList<Observer>(); 
  4.  
  5.     
  6.  
  7.     public void register(Observer observer) { 
  8.  
  9.        observerList.add(observer); 
  10.  
  11.     } 
  12.  
  13.     
  14.  
  15.     public void unregister(Observer observer) { 
  16.  
  17.        observerList.remove(observer); 
  18.  
  19.     } 
  20.  
  21.     
  22.  
  23.     public void newNotify() { 
  24.  
  25.        for(Observer observer : observerList) { 
  26.  
  27.            observer.update(); 
  28.  
  29.        } 
  30.  
  31.     } 
  32.  
  33.  
  34.   
  35.  
  36. public class ConcretPublisher2 implements Publisher{ 
  37.  
  38.   
  39.  
  40.     private List<Observer> observerList = new ArrayList<Observer>(); 
  41.  
  42.     
  43.  
  44.     public void register(Observer observer) { 
  45.  
  46.        observerList.add(observer); 
  47.  
  48.     } 
  49.  
  50.     
  51.  
  52.     public void unregister(Observer observer) { 
  53.  
  54.        observerList.remove(observer); 
  55.  
  56.     } 
  57.  
  58.     
  59.  
  60.     public void newNotify() { 
  61.  
  62.        for(Observer observer : observerList) { 
  63.  
  64.            observer.update(); 
  65.  
  66.        } 
  67.  
  68.     } 
  69.  


D.具體觀察者

  1. public class ConcreteObserver1 extends Observer{ 
  2.  
  3.     
  4.  
  5.     private Publisher publisher; 
  6.  
  7.     private String name; 
  8.  
  9.     
  10.  
  11.     public ConcreteObserver1(Publisher publisher,String name) { 
  12.  
  13.        this.publisher = publisher; 
  14.  
  15.        this.name = name; 
  16.  
  17.     } 
  18.  
  19.     @Override 
  20.  
  21.     public void update() { 
  22.  
  23.        // TODO Auto-generated method stub 
  24.  
  25.        System.out.println("對"+name+"說:訂單支付成功,請求供貨方發貨"); 
  26.  
  27.     } 
  28.  
  29.     public Publisher getPublisher() { 
  30.  
  31.        return publisher; 
  32.  
  33.     } 
  34.  
  35.     public void setPublisher(Publisher publisher) { 
  36.  
  37.        this.publisher = publisher; 
  38.  
  39.     } 
  40.  
  41.     public String getName() { 
  42.  
  43.        return name; 
  44.  
  45.     } 
  46.  
  47.     public void setName(String name) { 
  48.  
  49.        this.name = name; 
  50.  
  51.     } 
  52.  
  53.   
  54.  
  55.  
  56.   
  57.  
  58. public class ConcreteObserver2 extends Observer{ 
  59.  
  60.   
  61.  
  62.     private Publisher publisher; 
  63.  
  64.     private String name; 
  65.  
  66.     
  67.  
  68.     public ConcreteObserver2(Publisher publisher,String name) { 
  69.  
  70.        this.publisher = publisher; 
  71.  
  72.        this.name = name; 
  73.  
  74.     } 
  75.  
  76.     @Override 
  77.  
  78.     public void update() { 
  79.  
  80.        // TODO Auto-generated method stub 
  81.  
  82.        System.out.println("對"+name+"說:供貨方發貨成功,修改狀態吧!"); 
  83.  
  84.     } 
  85.  
  86.     public Publisher getPublisher() { 
  87.  
  88.        return publisher; 
  89.  
  90.     } 
  91.  
  92.     public void setPublisher(Publisher publisher) { 
  93.  
  94.        this.publisher = publisher; 
  95.  
  96.     } 
  97.  
  98.     public String getName() { 
  99.  
  100.        return name; 
  101.  
  102.     } 
  103.  
  104.     public void setName(String name) { 
  105.  
  106.        this.name = name; 
  107.  
  108.     } 
  109.  


4.       其他:

JDK提供對觀察者模式的內置支持。Observable類與Observer接口。下面是Observer模式的實現過程:

創建一個被觀察者,繼續java.util.Observable

創建一個觀察者,實現java.util.Observer接口

註冊觀察者,調用addObserver(Observer observer)

在被觀察者改變對象內部狀態的地方,調用setChanged()方法,然後調用 notifyObservers(Object)方法,通知被觀察者

在觀察者的updateObject)方法中,對改變做出響應。

 

代碼舉例:

  1. public class Watched extends Observable{ 
  2.  
  3.     private String data = ""
  4.  
  5.     public String retrieveData() { 
  6.  
  7.        return data; 
  8.  
  9.     } 
  10.  
  11.     public void changeData(String data) { 
  12.  
  13.        if(!this.data.equals(data)) { 
  14.  
  15.            this.data = data; 
  16.  
  17.            this.setChanged(); 
  18.  
  19.        } 
  20.  
  21.        this.notifyObservers(); 
  22.  
  23.     } 
  24.  
  25.  
  26.   
  27.  
  28. public class Watcher implements Observer{ 
  29.  
  30.     
  31.  
  32.     public Watcher(Watched w) { 
  33.  
  34.        w.addObserver(this); 
  35.  
  36.     } 
  37.  
  38.   
  39.  
  40.     @Override 
  41.  
  42.     public void update(Observable ob, Object arg) { 
  43.  
  44.        // TODO Auto-generated method stub 
  45.  
  46.        System.out.println("Data has bean changed to :" + ((Watched)ob).retrieveData() + ""); 
  47.  
  48.     } 
  49.  
  50.   
  51.  
  52.  
  53.   
  54.  
  55. public class Tester { 
  56.  
  57.     
  58.  
  59.     static private Watched watched; 
  60.  
  61.     static private Observer watcher; 
  62.  
  63.     
  64.  
  65.     public static void main(String[] args) { 
  66.  
  67.        watched = new Watched(); 
  68.  
  69.        watcher = new Watcher(watched); 
  70.  
  71.        
  72.  
  73.        watched.changeData("In c,we create bugs."); 
  74.  
  75.        watched.changeData("In java,we inherit bugs."); 
  76.  
  77.        watched.changeData("In java,we inherit bugs."); 
  78.  
  79.        watched.changeData("In visual Basic,We visualize bugs."); 
  80.  
  81.     } 
  82.  
  83.   
  84.  
  85.  
  86.   


5.       應用場景:

A.     當訂單有退款的時候,需要做一系統的操作,商品自動下架或者合作方自動下架等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章