设计模式 || 观察者模式
-
观察者模式的定义
观察者模式顾名思义,它是一个拥有被监听对象和监听对象两个角色,当被监听对象有状态改变时,所有监听它的对象都会做出自己的响应,这就是观察者模式。在我的理解上,这和发布订阅模式也有一定的类似性。
-
代码展示
首先,我们先来模拟一个场景,生活中的罪犯作为一个被监听的对象,而警察作为监听者可以监听罪犯。当罪犯做出犯罪行为的时候,就会触发一个更新事件,可以通知到警察做出响应(当然,现实中是被动通知的)。下面,我们可以通过代码来模拟一下这个场景。
我们新建一个罪犯类,继承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(监听器)都用到了这个设计模式。虽然具体的实现有可能不同,但是其中有几个是不变的:
- 被观察者
- 一个或多个观察者
- 记录观察者的集合
- 通知方法和响应方法