Observer、Listener、Hook、Callback这些本质都是观察者模式
一个事件可以被多个方法观察,一个方法可以观察多个事件,为了进行区分因此又引入了事件类这个样一个参数。
代码结构
源码
package com.myspringboot.shejimoshi.guanchazhe;
import java.util.ArrayList;
import java.util.List;
public class Child {
private List<Observer> observers = new ArrayList<>();
{
// 可以将观察者提前加进来,也可以动态的添加
observers.add(new Dad());
observers.add(new Mum());
}
public void wakeUp() {
WakeUpEvent event = new WakeUpEvent(System.currentTimeMillis(), "bed", this);
for (Observer o : observers) {
o.actionOnWakeUp(event);
}
}
public void add(Observer observer){
observers.add(observer);
}
}
package com.myspringboot.shejimoshi.guanchazhe;
public class Dad implements Observer {
public void feed() {
System.out.println("dad feeding...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
feed();
}
}
package com.myspringboot.shejimoshi.guanchazhe;
public class Dog implements Observer {
public void wang() {
System.out.println("dog wang...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
wang();
}
}
package com.myspringboot.shejimoshi.guanchazhe;
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.wakeUp();
child.add(new Dog());
child.add((e) -> System.out.println("e bulabula"));
child.wakeUp();
}
}
package com.myspringboot.shejimoshi.guanchazhe;
public class Mum implements Observer {
public void hug() {
System.out.println("mum hugging...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
hug();
}
}
package com.myspringboot.shejimoshi.guanchazhe;
public interface Observer {
void actionOnWakeUp(WakeUpEvent event);
}
package com.myspringboot.shejimoshi.guanchazhe;
/**
* 有很多时候,观察者需要根据事件的具体情况来进行处理
* 大多数时候,我们处理事件的时候,需要事件源对象
* 事件也可以形成继承体系
*/
public class WakeUpEvent<T> {
long timestamp;
String loc;
T source;
public WakeUpEvent(long timestamp, String loc, T source) {
this.timestamp = timestamp;
this.loc = loc;
this.source = source;
}
T getSource() {
return source;
}
}