觀察者模式在抓捕專案中的應用
阿新 • • 發佈:2018-11-08
專案程式碼連結:https://github.com/Way123Ne/designpattern/tree/master/ObserverDemo/src/com
靜態關係結構圖:
警察在找到嫌犯的時候,一般都會蹲點監察,這裡我有三名便衣警察來蹲點監察2名嫌犯,三名便衣分別是:張浩天、石破天、趙日天,兩名嫌犯是:大熊與黑狗,詳見程式碼:
觀察者介面:Observer
1 public interface Observer { 2 void update(String message,String name); 3 }
定義三名便衣觀察者:Bianyi1、Bianyi2、Bianyi3
1 /** 2 * 便衣警察張浩天 3 */ 4 public class Bianyi1 implements Observer { 5 //定義姓名 6 private String bname = "張浩天"; 7 @Override 8 public void update(String message,String name) { 9 System.out.println(bname+":"+name+"那裡有新情況:"+ message); 10 } 11 } 12 13 /** 14 * 便衣警察石破天 15 */ 16 public class Bianyi2 implements Observer { 17 //定義姓名 18 private String bname = "石破天"; 19 @Override 20 public void update(String message,String name) { 21 System.out.println(bname+":"+name+"那裡有新情況:"+ message); 22 } 23 } 24 25 /** 26 * 便衣警察趙日天 27 */ 28 public class Bianyi3 implements Observer { 29 //定義姓名 30 private String bname = "趙日天"; 31 @Override 32 public void update(String message,String name) { 33 System.out.println(bname+":"+name+"那裡有新情況:"+ message); 34 } 35 }
目標介面:Huairen
1 public interface Huairen { 2 //新增便衣觀察者 3 void addObserver(Observer observer); 4 //移除便衣觀察者 5 void removeObserver(Observer observer); 6 //通知觀察者 7 void notice(String message); 8 }
定義兩個嫌疑犯:XianFan1、XianFan2
1 import java.util.*; 2 /** 3 * 嫌犯大熊 4 */ 5 public class XianFan1 implements Huairen { 6 //別稱 7 private String name = "大熊"; 8 //定義觀察者集合 9 private List<Observer> observerList = new ArrayList<Observer>(); 10 //增加觀察者 11 @Override 12 public void addObserver(Observer observer) { 13 if(!observerList.contains(observer)){ 14 observerList.add(observer); 15 } 16 } 17 //移除觀察者 18 @Override 19 public void removeObserver(Observer observer) { 20 if(observerList.contains(observer)){ 21 observerList.remove(observer); 22 } 23 } 24 //通知觀察者 25 @Override 26 public void notice(String message) { 27 for(Observer observer:observerList){ 28 observer.update(message,name); 29 } 30 } 31 } 32 33 import java.util.*; 34 /** 35 * 嫌犯黑狗 36 */ 37 public class XianFan2 implements Huairen { 38 //別稱 39 private String name = "黑狗"; 40 //定義觀察者集合 41 private List<Observer> observerList = new ArrayList<Observer>(); 42 //增加觀察者 43 @Override 44 public void addObserver(Observer observer) { 45 if(!observerList.contains(observer)){ 46 observerList.add(observer); 47 } 48 } 49 //移除觀察者 50 @Override 51 public void removeObserver(Observer observer) { 52 if(observerList.contains(observer)){ 53 observerList.remove(observer); 54 } 55 } 56 //通知觀察者 57 @Override 58 public void notice(String message) { 59 for(Observer observer:observerList){ 60 observer.update(message,name); 61 } 62 } 63 }
測試類:ObserverTest
1 public class ObserverTest {2 public static void main(String[] args) { 3 //定義兩個嫌犯 4 Huairen xf1 = new XianFan1(); 5 Huairen xf2 = new XianFan2(); 6 //定義三個觀察便衣警察 7 Observer o1 = new Bianyi1(); 8 Observer o2 = new Bianyi2(); 9 Observer o3 = new Bianyi3(); 10 //為1個嫌犯指定多個便衣 11 xf1.addObserver(o1); 12 xf1.addObserver(o2); 13 xf1.addObserver(o3); 14 //為1個嫌犯指定1個便衣 15 xf2.addObserver(o2); 16 String message1 = "要逃跑"; 17 String message2 = "已抓捕"; 18 xf1.notice(message1);
19 xf2.notice(message2);
20 } 21 }
通過上面的例項可以很明顯的看出,觀察者模式的大概模型,關鍵是:
1、針對觀察者與被觀察者分別定義介面,有利於分別進行擴充套件。
2、重點就在被觀察者的實現中:
(1)定義觀察者集合,並定義針對集合的新增、刪除操作,用於增加、刪除訂閱者(觀察者)
(2)定義通知方法,用於將新情況通知給觀察者使用者(訂閱者使用者)
3、觀察者中需要有個接收被觀察者通知的方法。
觀察者模式定義的是一對多的依賴關係,一個被觀察者可以擁有多個觀察者,並且通過介面對觀察者與被觀察者進行邏輯解耦,降低二者的直接耦合。