一.介绍
1. 观察者模式:又可称为发布-订阅模式,顾名思义,就是定义一个监听者,监听着被观察的事件,一旦观察到被监听者某个状态变化就会触发相应的事件
2.应用场景
观察者模式常被用于实现订阅功能的场景,如微博订阅,当我们订阅了某个人的微博账号,该用户发布消息,就会通知到我们
3.实现方案:
(1).针对观察者和被观察者分别定义接口(有利于进行扩展)
(2)被观察者: 1)定义观察者集合,并定义针对集合的添加,删除操作
2)定义通知方法,通过遍历集合调用观察者相应方法
(3)观察者中需要有个处理相应事件的方法
4.优点
观察者和被观察者是抽象耦合的,建立了一套触发机制
二.实例
小红遇到危险,喊救命,这时小黄和小明听到,触发相应的事件
1.被观察者接口
//被观察者
public interface Subject {
void call();
void addObserver(Observer ob);
}
2.观察者接口
//观察者
public interface Observer {
void doSomething();
}
3.小红(被观察者)
//被观察者
public class XiaoHong implements Subject {
private ArrayList<Observer> observers;
public XiaoHong(){
observers = new ArrayList<Observer>();
}
@Override
public void call() {
System.out.println("小红:救命啊...");
for (Observer observer : observers) {
observer.doSomething();
}
}
@Override
public void addObserver(Observer ob) {
if (ob != null){
observers.add(ob);
}
}
}
4.小黄(观察者)
//观察者
public class XiaoHuang implements Observer {
@Override
public void doSomething() {
System.out.println("小黄:飞奔过去...");
}
}
5.小明(观察者)
//观察者
public class XiaoMing implements Observer {
@Override
public void doSomething() {
System.out.println("小明:报警...");
}
}
6.测试
public class ObserverApp {
public static void main(String[] args) {
XiaoHong xiaoHong = new XiaoHong();//被观察者
XiaoHuang xiaoHuang = new XiaoHuang();//观察者
XiaoMing xiaoming = new XiaoMing();//观察者
xiaoHong.addObserver(xiaoHuang);//向小红注册观察者
xiaoHong.addObserver(xiaoming);//向小红注册观察者
xiaoHong.call();
}
}