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