设计模式——观察者设计模式结合事件发布
几个要素
要素一: 被观察者持有观察者的引用,有多个观察者,所以得用list存储
要素二: 支持动态注册观察者,注销观察者
要素三: 可以发布事件并且通知所有观察者
要素四: 观察者只会观察自己感兴趣的事件
代码实现
观察者相关代码
public interface EventListener {
boolean support(Event event);//感兴趣的事件
void update();//感兴趣后执行逻辑
}
public class L1 implements EventListener {
@Override
public boolean support(Event event) {
if(event instanceof StartEvent)
return true;
return false;
}
@Override
public void update() {
System.out.println("l1");
}
}
public class L2 implements EventListener {
@Override
public boolean support(Event event) {
if(event instanceof RefreshEvent)
return true;
return false;
}
@Override
public void update() {
System.out.println("l2");
}
}
事件相关代码
public interface Event {
}
public class StartEvent implements Event{
}
public class RefreshEvent implements Event {
}
被观察者代码
public class Subject {
List<EventListener> listeners = new ArrayList<>();//所有观察者集合
Event event;//被观察者发生的事件
//注册观察者
public void register(EventListener listener){
listeners.add(listener);
}
//注销观察者
public void unregister(EventListener listener){
listeners.remove(listener);
}
//发布事件
public void publishEvent(Event event){
this.event = event;
notifyAllListener();
}
//通知所有观察者
private void notifyAllListener(){
for (EventListener listener : listeners) {
//观察者感兴趣的事件才回调update
if(listener.support(event)){
listener.update();
}
}
}
}
测试类代码
public class Main {
public static void main(String[] args) throws InterruptedException {
Subject subject = new Subject();
L1 l1 = new L1();
L2 l2 = new L2();
subject.register(l1);
subject.register(l2);
subject.publishEvent(new StartEvent());
subject.publishEvent(new RefreshEvent());
subject.unregister(l1);
subject.publishEvent(new StartEvent());
}
}