观察者模式(Observer Pattern)升级版

简介

前面的博客https://goo.gl/DFOz50中已经介绍过基本的观察者模式的代码实现,在实际应用中,我们往往希望代码更加简洁,同时也希望能与现有的框架,比如Spring,结合起来。下面介绍如何做抽象。

简单抽象

前面介绍过观察者模式有Subject,Observer,Client几种角色。在使用面向对象的时候Subject 和Observer都可以被抽象成接口,所以从原来的三种角色可以进化为6个角色。
(1) Subject : 被监控对象,抽象以后我们叫做BUS(总线,所有对被监控对象的操作都由它完成);
(2) concreteSubject:具体的被监控对象
(3)Observer(Listener):观察者
(4)concreteObserver:具体的观察者
(5)event : 监控对象和被监控对象交互时用到的消息

下面的类图用来解释新的观察者模式:
这里写图片描述


Note:
(1) 图中引入了泛型T作为观察者,从而使得每一个Bus的具体实现对应一个Listener接口,这样一个Bus最终只对应到一类事件;
(2)Listener和Bus之间交互使用一个单独的类Event实现;
(3)ExecutorService的引入使得监听器的响应与主线程异步进行,提升效率。

如果对上面的图进一步抽象的话就编程了下面这样:
这里写图片描述

代码实现

Step 1

创建AbstractBus

public abstract class BaseBus<T> {
    private final List<T> listeners = new CopyOnWriteArrayList<T>();
    private final ExecutorService executorService;

    protected BaseBus(ExecutorService executorService) {
        this.executorService = executorService;
    }


    public void iterate(final ListenerCallback<T> callback){
        for(final T t:listeners){
            this.executorService.submit(new Callable<Object>() {
                @Override
                public Object call() throws Exception {
                    callback.doWithListener(t);
                    return true;
                }
            });
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值