观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),也叫监听器模式(Listener),它是一个在项目中经常使用的模式,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
目录
一、实体类图(Event 中关联源对象,可以获取元信息)
二、业务代码样例
package com.hongyan.observer.v8;
import java.util.ArrayList;
import java.util.List;
/**
* 有很多时候,观察者需要根据事件的具体情况来进行处理
* 大多数时候,我们处理事件的时候,需要事件源对象
* 事件也可以形成继承体系
*/
class Child {
private boolean cry = false;
private List<Observer> observers = new ArrayList<>();
{
observers.add(new Dad());
observers.add(new Mum());
observers.add(new Dog());
observers.add((e)->{
System.out.println("ppp");
});
// hook callback function
}
/**
* 可以执行钩子函数
*/
public boolean isCry() {
return cry;
}
public void wakeUp() {
cry = true;
wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed", this);
for(Observer o : observers) {
o.actionOnWakeUp(event);
}
}
}
abstract class Event<T> {
abstract T getSource();
}
class wakeUpEvent extends Event<Child>{
long timestamp;
String loc;
Child source;
public wakeUpEvent(long timestamp, String loc, Child source) {
this.timestamp = timestamp;
this.loc = loc;
this.source = source;
}
@Override
Child getSource() {
return source;
}
public void callback(){
if (this.source != null && this.source.isCry()) {
System.out.println("回调函数");
}
}
}
interface Observer {
void actionOnWakeUp(wakeUpEvent event);
}
class Dad implements Observer {
public void feed() {
System.out.println("dad feeding...");
}
@Override
public void actionOnWakeUp(wakeUpEvent event) {
feed();
event.callback();
}
}
class Mum implements Observer {
public void hug() {
System.out.println("mum hugging...");
}
@Override
public void actionOnWakeUp(wakeUpEvent event) {
hug();
event.callback();
}
}
class Dog implements Observer {
public void wang() {
System.out.println("dog wang...");
}
@Override
public void actionOnWakeUp(wakeUpEvent event) {
wang();
event.callback();
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
c.wakeUp();
}
}
三、框架中的应用
数据格式工具
(1)实体实现此接口
(2)DateFormatter 是Observer的实现类之一,同上图中的【Sbuject】,同时当前类自己也是一个观察者,类构建时候初始化方法,会将 this 和Locale用的调用一些方法
(3)发生变更,监听器执行的一些方法,本质是调用观察者
(4)回调Observer 的update方法,此时调用的即是源对象了,理解了文章中最开始的类图,此执行流程即可清楚了。
总结:观察者模式应用的比较广,也可以叫监听器模式,在构建较复杂的业务逻辑时候,监听器回调是常用的手段,通过回调源对象信息,从而完成闭环通知。