观察者模式(Observer Pattern)又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听(Souce/Listener)模式或从属者(Dependents)模式。定义一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听,当主题对象状态变化时,所有依赖于它的对象都会得到通知并自动更新,使观察者和被观察者松耦合,在代码中一般以回调的方式体现。属于行为型模式。
适用场景
- 当一个对象模型包含两个方面内容,其中一个方面依赖于另一个方面;
- 一个对象或多个对象的变化依赖于另一个对象的变化;
- 实现类似广播机制,无须知道具体收听者,只需分发广播,感兴趣的对象自动接收广播并做出回应;
- 多层级嵌套,形成链式触发机制;
观察者
// 问题处理者作为观察者
public class Processor implements Observer {
private String name;
public Processor(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
AppPlatform platform = (AppPlatform) o;
Question question = (Question) arg;
System.out.println("平台收到了来自" + question.getUsername() + "提出的问题,请" + name + "处理。");
}
}
被观察者
// 平台作为被观察者,声明为单例对象
public class AppPlatform extends Observable {
private static final AppPlatform INSTANCE = new AppPlatform();
private AppPlatform() {}
public static AppPlatform getInstance() {
return INSTANCE;
}
public void publishQuestion(Object object) {
Question question = (Question) object;
System.out.println(question.getUsername() + "在平台上提交了一个问题,问题内容为:" + question.getContent());
setChanged();
notifyObservers(object);
}
}
数据对象
public class Question {
private String username;
private String content;
public Question(String username, String content) {
this.username = username;
this.content = content;
}
public String getUsername() {
return username;
}
public String getContent() {
return content;
}
}
测试类
public class Test {
public static void main(String[] args) {
AppPlatform platform = AppPlatform.getInstance();
Processor zhangsan = new Processor("张三");
Processor lisi = new Processor("李四");
platform.addObserver(zhangsan);
platform.addObserver(lisi);
Question question = new Question("用户XXX", "钢铁是怎样炼成的?");
platform.publishQuestion(question);
}
}
执行结果:所有实现了观察者接口的都会收到通知
用户XXX在平台上提交了一个问题,问题内容为:钢铁是怎样炼成的? 平台收到了来自用户XXX提出的问题,请李四处理。 平台收到了来自用户XXX提出的问题,请张三处理。用google提供的guava框架
pom引入依赖
com.google.guava guava18.0
观察者
public class GuavaEvent {
// guava中通过@Subscribe注解实现观察者回调方法
@Subscribe
public void observer(String obj) {
System.out.println("执行observer回调方法,传参为" + obj);
}
}
测试类
public class Test {
public static void main(String[] args) {
EventBus eventBus = new EventBus();
GuavaEvent event = new GuavaEvent();
eventBus.register(event);
eventBus.post("AAAAA");
}
}
执行结果
执行observer回调方法,传参为AAAAA



