目录
- 1 介绍
- 2 例子
- 2.1 观察者接口
- 2.2 观察者实体
- 2.3 被观察者
- 2.4 测试主类
- 3 总结
- 3.1 核心角色
- 3.2 核心代码结构
1 介绍
当对象间存在一对多关系时,则使用观察者模式。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
2 例子
假设有一个自然灾害观测站,当发生灾害的时候要通知到每一个在这里注册登记过的电视台,并且要第一时间播报给观众。
2.1 观察者接口
abstract class Observer {
//向本台观众发送灾难预警
public abstract void warning(String disaster);
}
观察者必须要第一时间把消息播放给观众。
2.2 观察者实体
//中央电视台
class CCTV extends Observer {
//构造CCTV对象的时候就把CCTV在观察站注册了
CCTV(DisasterStation disasterStation) {
disasterStation.add(this);
}
@Override
public void warning(String disaster) {
System.out.println("中央电视台提醒您:" + disaster + "即将到来!!!");
}
}
//四川电视台
class SCTV extends Observer {
SCTV(DisasterStation disasterStation) {
disasterStation.add(this);
}
@Override
public void warning(String disaster) {
System.out.println("四川电视台提醒您:" + disaster + "即将到来!!!");
}
}
//山东电视台
class SDTV extends Observer {
SDTV(DisasterStation disasterStation) {
disasterStation.add(this);
}
@Override
public void warning(String disaster) {
System.out.println("山东电视台提醒您:" + disaster + "即将到来!!!");
}
}
注意电视台的构造函数,里面的参数是被观察的对象,被观察者把这个观察者添加到注册列表。
2.3 被观察者
//自然灾害观察站
class DisasterStation {
//存放电视台的注册信息
List<Observer> list = new ArrayList<>();
//添加注册
public void add(Observer observer) {
list.add(observer);
}
//监测到地震
public void happen(String disaster) {
//通知所有的观察者
Iterator<Observer> iterator = list.listIterator();
while (iterator.hasNext()) {
iterator.next().warning(disaster);
}
}
}
要有一个注册列表,有添加功能(当然也有删除功能),还有发生灾害的时候要能直接调用电视台的预警方法展示给观众。
2.4 测试主类
public class Main {
public static void main(String[] args) {
//创建观测站对象
DisasterStation disasterStation = new DisasterStation();
//创建电视台对象
Observer cctv = new CCTV(disasterStation);
Observer sctv = new SCTV(disasterStation);
Observer sdtv = new SDTV(disasterStation);
//当灾害发生的时候
disasterStation.happen("地震");
disasterStation.happen("海啸");
}
}
运行结果:
中央电视台提醒您:地震即将到来!!!
四川电视台提醒您:地震即将到来!!!
山东电视台提醒您:地震即将到来!!!
中央电视台提醒您:海啸即将到来!!!
四川电视台提醒您:海啸即将到来!!!
山东电视台提醒您:海啸即将到来!!!
3 总结
观察者模式很好的实现了当一个对象发生变化的时候,要通知到所有关心这个变化的对象。适用场景非常多。
3.1 核心角色
- 观察者接口:当观察到变化的时候,观察者应该有方法去接受处理这个变化。
- 观察者实体:实现观察处理变化的方法。同时在自己被创建的时候就应该去被观察者那里注册。
- 被观察者类:维护一个观察者的注册列表,添加删除观察者的方法,当自己变化的时候,把变化通知给每一个观察者。
3.2 核心代码结构
被观察者维护一个观察者的列表,一有变化就通知观察者。注意和享元模式的异同。