1. 程式人生 > >觀察者模式在抓捕專案中的應用

觀察者模式在抓捕專案中的應用

專案程式碼連結: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、觀察者中需要有個接收被觀察者通知的方法。

  觀察者模式定義的是一對多的依賴關係,一個被觀察者可以擁有多個觀察者,並且通過介面對觀察者與被觀察者進行邏輯解耦,降低二者的直接耦合。