设计模式——观察者设计模式结合事件发布

设计模式——观察者设计模式结合事件发布

几个要素

要素一: 被观察者持有观察者的引用,有多个观察者,所以得用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());

    }
}

画图总结

在这里插入图片描述

发布了164 篇原创文章 · 获赞 81 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/LiuRenyou/article/details/104383444