设计模式 || 观察者模式

  • 观察者模式的定义

观察者模式顾名思义,它是一个拥有被监听对象监听对象两个角色,当被监听对象有状态改变时,所有监听它的对象都会做出自己的响应,这就是观察者模式。在我的理解上,这和发布订阅模式也有一定的类似性。

  • 代码展示

首先,我们先来模拟一个场景,生活中的罪犯作为一个被监听的对象,而警察作为监听者可以监听罪犯。当罪犯做出犯罪行为的时候,就会触发一个更新事件,可以通知到警察做出响应(当然,现实中是被动通知的)。下面,我们可以通过代码来模拟一下这个场景。

 

我们新建一个罪犯类,继承jdk提供Observable类,用于表示这是一个被监听对象。这里的核心方法就是状态改变方法:setChanged();这个用与标明被观察类是否有状态更新,若没有状态改变,执行下面的通知方法会无效。通知方法:notifyObservers();这里内部有Vector集合存放的是所有观察者,它会调用所有观察者的update()方法。

 1 package com.hill.observer;
 2 
 3 import java.util.Observable;
 4 
 5 /**
 6  * @author HILL
 7  * @version V1.0
 8  * @date 2019/7/21
 9  * 一个罪犯,每个罪犯都会被警察叔叔暗中观察,一旦罪犯出现做出违法犯罪的事情,
10  * 就会被发现,最终被抓捕。
11  **/
12 public class Criminal extends Observable {
13 
14     public String name;
15 
16     public Criminal(String name) {
17         this.name = name;
18     }
19 
20     public void rob(){
21         System.out.println(name+"准备进行抢劫");
22         //父类Observable的方法,标记该对象已更改状态
23         setChanged();
24         //通知所有警察叔叔,可以进行抓捕。
25         notifyObservers();
26     }
27 
28 }

 

同样,我们新建一个警察类,利用jdk自带的Observer接口,实现这个接口的update()方法用于表示当观察的对象进行状态更新时,观察者需要执行的策略。

 1 package com.hill.observer;
 2 
 3 import java.util.Observable;
 4 import java.util.Observer;
 5 
 6 /**
 7  * @author HILL
 8  * @version V1.0
 9  * @date 2019/7/21
10  **/
11 public class Police implements Observer {
12 
13     @Override
14     public void update(Observable o, Object arg) {
15         //警察叔叔察觉到了罪犯的犯罪行为,实施相应措施
16         Criminal criminal = (Criminal) o;
17         System.out.println("警察对"+criminal.name+"进行追捕");
18     }
19 }

 

最后的Demo是这样的。

 1 package com.hill.observer;
 2 
 3 import sun.plugin2.message.JavaScriptBaseMessage;
 4 
 5 /**
 6  * @author HILL
 7  * @version V1.0
 8  * @date 2019/7/21
 9  **/
10 public class ObserverDemo {
11 
12     public static void main(String[] args) {
13         Criminal criminal1 = new Criminal("罪犯1");
14         Criminal criminal2 = new Criminal("罪犯2");
15         Police police = new Police();
16         //罪犯被警察监视
17         criminal1.addObserver(police);
18         criminal2.addObserver(police);
19         
20         criminal1.rob();
21         criminal2.rob();
22 
23     }
24 }

 

 

  • 总结

观察者模式是一个很容易理解的概念,在实际的应用中,java的Swing变成,web开发中的listener(监听器)都用到了这个设计模式。虽然具体的实现有可能不同,但是其中有几个是不变的:

  1. 被观察者
  2. 一个或多个观察者
  3. 记录观察者的集合
  4. 通知方法和响应方法

 

posted @ 2019-07-24 14:42  半生瓜丶  阅读(167)  评论(0编辑  收藏  举报