概念
这是一个十分容易理解的模式,当一个对象(被观察者)的属性发生变化,或者该对象调用某些方法,所有依赖它的对象(观察者)发生一系列变化。
实现
案例:我是一个996的程序员,喜欢哈士奇,在自己的出租屋里养了一只哈士奇,不过由于工作原因,没能常常在家,于是我就在上班的时候,给哈士奇放置一天的食物和水,供它一天吃饱喝足。不过哈士奇都有一个天性——拆家,于是我就安装了一个智能摄像头,用于观察我的哈士奇有没有拆家。
实现代码如下:
首先定义一个狗的接口:
public interface Dog {
//拆家
public void destroy();
}
定义一个二哈的类,是狗接口的具体实现:
public class ErHa implements Dog {
//实例一个摄像头,用于观察二哈的行为
private Monitoring monitoring = new Monitoring();
//二哈要拆家了
@Override
public void destroy() {
System.out.println("我要开始拆家了!!!");
//摄像头发出警报
monitoring.call();
}
}
定义一个观察者的接口:
public interface Observer {
//一旦发现二哈在拆家,就做出某些行为
public void call();
}
定义一个摄像头的类,实现观察者接口的:
public class Monitoring implements Observer {
public Monitoring() {}
//发现二哈在拆家,发出警报
@Override
public void call() {
System.out.println("biu biu biu biu。。。。");
System.out.println("摄像头:主人!二哈在拆家!");
}
}
最后定义主人进行测试:
public class Owner {
public static void main(String[] args) {
//定义出二哈
ErHa erHa = new ErHa();
//二哈开始拆家
erHa.destroy();
}
}
实验结果:
案例升级:二哈拆家能力太强了,把我的摄像头也拆掉了,我需要买一个新的摄像头,而且我还叫包租婆不定时过来帮我看看屋子有没有被拆掉。
所以观察者的数量有变化,那么就会涉及观察者的增加和删除,不过JDK中提供了java.util.Observable 实现类和 java.util.Observer 接口,接下来是对代码的进一步升级:
定义一个二哈的类:
public class ErHa extends Observable implements Dog {
@Override
public void destroy() {
System.out.println("我要开始拆家了!!!");
super.setChanged();
//通知所有观察者
super.notifyObservers();
}
}
定义一个摄像头的类:
public class Monitoring implements Observer {
//发现二哈在拆家,发出警报
@Override
public void update(Observable o, Object arg) {
System.out.println("biu biu biu biu。。。。");
System.out.println("摄像头:主人!二哈在拆家!");
}
}
定义一个包租婆的类:
public class BaoZuPo implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("小寸,你家的狗又在拆家了!你快回来!");
}
}
我的测试类:
public class Owner {
public static void main(String[] args) {
//定义出二哈
ErHa erHa = new ErHa();
//定义观察者
BaoZuPo baoZuPo = new BaoZuPo();
Monitoring monitoring = new Monitoring();
//给二哈添加观察者
erHa.addObserver(baoZuPo);
erHa.addObserver(monitoring);
//二哈开始拆家
erHa.destroy();
}
}
实验结果:
注意:如果观察者较多的情况下,需要使用异步处理,使用异步处理的时候需要考虑线程安全和队列问题。
本文的代码:https://pan.baidu.com/s/1ILC5YVJ7u6deUTY2W04XqA
提取码:6tre