設計模式--觀察者模式

設計模式--觀察者模式

一、觀察者模式

觀察者模式:定義對象間一種一對多的依賴關係,當一個對象狀態發生變化時,全部依賴於它的對象都獲得通知,並被自動更新。java

二、觀察者模式的結構

  • 角色設計模式

    • 主題(Subject):主題是一個接口,該接口規定了具體主題須要實現的方法,好比添加,刪除觀察者以及通知觀察者的方法。數組

    • 觀察者(ObServer): 觀察者是一個接口,該接口規定了具體觀察者用來得到數據的方法。ide

    • 具體主題(ConcreteSubject):具體主題是實現主題接口的類的一個實例,該實例包含觀察者關心的數據,並且這些數據可能常常發生變化。具體主題須要使用一個集合來存放觀察者的引用,以便數據變化時通知具體的觀察者。spa

    • 具體觀察者(ConreteObserver):具體觀察者是實現觀察者接口的類的一個實例。具體觀察者包含具體主題的引用,以便讓具體主題將本身添加到具體主題的集合中,使本身成爲具體主題的觀察者,或者從具體主題的集合中將本身刪除,不成爲具體主題的觀察者。設計

  • UML圖code

  

三、觀察者模式舉例

 主題接口:Subject.javaserver

 1 package com.nick.pattern.observer; 2 
 3 import java.util.ArrayList; 4 
 5 /** 6 * @ 主題接口:定義了觀察者數組(存放觀察者的信息)和抽象方法 7 * @author nick 8 * 9 */
10 public interface Subject {   11    ArrayList<Observer> observers =null;
12   void attach(Observer obs);
13 void detach(Observer obs);
14 void cry();  //至關於notify()通知方法
15 }

 觀察者接口:Observer.java對象

1 package com.nick.pattern.observer; 2 /**
3  * @ 觀察者接口 4  * @author nick 5  */
6 public interface Observer { 7     void response(); //至關於update()方法  8 }

 具體主題類:Cat.javablog

 1 package com.nick.pattern.observer;  2 
 3 import java.util.ArrayList;  4 
 5 /**
 6  * @ 具體主題:貓(老鼠和狗是觀察者,他們經過觀察貓的行爲,作出反應)  7  * @author nick  8  *  9  */
10 public class Cat implements Subject { 11     ArrayList<Observer> observers = new ArrayList<Observer>(); 12     
13  @Override 14     public void attach(Observer obs) { 15  observers.add(obs); 16  } 17 
18  @Override 19     public void detach(Observer obs) { 20  observers.remove(obs); 21  } 22 
23  @Override 24     public void cry() {    //通知方法
25         System.out.print("貓叫:"); 26         System.out.println("喵喵喵"); 27         for(Observer obs:observers) { 28  obs.response(); 29  } 30  }
31 }

具體觀察者:Dog.java

 1 package com.nick.pattern.observer;  2 /**
 3  * @ 具體觀察者: 狗  4  * @author nick  5  *  6  */
 7 public class Dog  implements Observer{  8 
 9  @Override 10     public void response() { 11         System.out.print("狗叫:"); 12         System.out.println("汪汪汪"); 13  } 14 
15 }

具體觀察者:Mouse.java

 1 package com.nick.pattern.observer;  2 /**
 3  * @ 具體觀察者:老鼠  4  * @author nick  5  *  6  */
 7 public class Mouse implements Observer{  8 
 9  @Override 10     public void response() { 11         System.out.print("老鼠跑:"); 12         System.out.println("跑跑跑"); 13  } 14 
15 }

主程序:Application.java

 1 package com.nick.pattern.observer;  2 /**
 3  * @ 主程序  4  * @author nick  5  *  6  */
 7 public class Application {  8 
 9     public static void main(String[] args) { 10             Subject cat = new Cat(); 11             Observer dog = new Dog(); 12             Observer mouse = new Mouse(); 13  cat.attach(dog); 14  cat.attach(mouse); 15             
16             cat.cry();//觸發通知方法
17  } 18 
19 }

運行結果:

  

 

 

 四、觀察者模式的優缺點

  • 優勢1: 具體主題和觀察者是鬆耦合的關係。因爲主題接口僅僅依賴與觀察者接口,所以具體主題只是知道他的觀察者是實現觀察者接口的某個類的實例,但不須要知道是哪一個類。
  • 優勢2:具體觀察者只須要知道它依賴的主題是實現主題接口的某個實例便可,不須要知道具體是哪一個類。
  • 優勢3:觀察者模式知足「開-閉」原則。主題接口(Subject)僅僅依賴於觀察者接口(Observer)。這樣具體主題的類也僅僅依賴於觀察者接口,增長新的實現觀察者接口的類,沒必要修改建立具體主題的類的代碼:
    •   新增長一個觀察者Pig.java
    •  1 package com.nick.pattern.observer;
       2 /**
       3  * @ 新增的觀察者Pig
       4  * @author nick
       5  */
       6 public class Pig implements Observer{
       7 
       8     @Override
       9     public void response() {
      10         System.out.println("豬叫:");
      11         System.out.println("咯咯咯");
      12     }
      13 
      14 }
    • 只須要在主程序中添加這兩行代碼

 

 

 

相關文章
相關標籤/搜索