观察者模式又叫发布订阅模式
它是处理多个对象依赖于一个对象的一种模式。让多个对象监听一个对象,当这个对象的状态有所改变,他会通知所有被观察对象。
讲个故事:
2017年4月19日下午3点19分 有名武装劫匪正在作案(抢切糕),但是因为朝阳区群众举报,被警察发现并且监视起来。警长把警员分为A队与B队,计划在劫匪作案完准备跑的时候行动,A队负责突击,B队负责警戒周围以防有同伙。
这个故事里面劫匪逃跑的时候就是这个对象的状态有所改变,话不多说。
一、观察者创建
public interface watcher {
public void action();
}
public class policemanA implements watcher{
@Override
public void action() {
System.out.println("突击!---A队");
}
}
public class policemanB implements watcher{
@Override
public void action() {
System.out.println("警戒!---B队");
}
}
二、被观察者创建
public interface watched {
public void addWatcher(watcher watcher);
public void delWatcher(watcher watcher);
public void run();
}
import java.util.ArrayList;
import java.util.List;
public class Suspect implements watched {
List<watcher> list = new ArrayList<watcher>();
public Suspect() {
System.out.println("正在作案");
}
@Override
public void addWatcher(watcher watcher) {
list.add(watcher);
}
@Override
public void delWatcher(watcher watcher) {
list.remove(watcher);
}
@Override
public void run() {
System.out.println("不好被发现了,快跑!");
for (watcher watcher : list){
watcher.action();
}
}
}
三、运行
public class app {
public static void main(String[] args) {
watcher policemanA = new policemanA();
watcher policemanB = new policemanB();
Suspect suspect = new Suspect();
//开始监控
suspect.addWatcher(policemanA);
suspect.addWatcher(policemanB);
suspect.run();
}
}
四、结果
正在作案
不好被发现了,快跑!
突击!---A队
警戒!---B队
心得:
一、当一个对象的状态改变的同时需要改变其他对象,我们可以使用观察者模式。
二、观察者模式可以起到松耦合的作用,将两个有依赖关系的对象抽象出来,一个对象细节的改变不影响另一个对象。符合依赖反转原则。