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

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

几个要素

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

    }
}

画图总结

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值