事件驱动模型

2018-02-07  本文已影响0人  枫叶_huazhe

观察者模式与事件驱动模型

观察者模式:

发布 - 订阅 , 变化 - 更新

事件驱动模型

请求 - 响应, 事件发生 - 事件 处理

2.事件驱动模型

事件源
事件对象(AppEvent)
监听器
Manager类

3.以dapeng-container为例

public interface AppListener extends EventListener {

    public void appRegistered(AppEvent event);

    public void appUnRegistered(AppEvent event);
}

持有AppEvent事件,定义注册和注销自己

public class AppEvent extends EventObject {

    private AppEventType eventType;

    public AppEvent(Application application, AppEventType eventType) {
        super(application);
        this.eventType = eventType;
    }

    public AppEventType getEventType() {
        return this.eventType;
    }
}

事件对象,需要持有事件源,可选持有附加信息。

这里在构造器里,除了持有数据源Application外,还增加AppEvent附加信息,作更进一步判断.

一般情况下是事件源来持有监听器列表和注册注销api的,dapeng在这里做了一个代理,注册和注销api放到来DapengContainer中。

并且,除了持有监听器列表之外,还持有事件源列表。如下:

private List<AppListener> appListeners = new Vector<>();

private List<Application> applications = new Vector<>();
提供监听器的注册和注销api
public void registerAppListener(AppListener listener) {
        this.appListeners.add(listener);
}

public void unregisterAppListener(AppListener listener) {
        this.appListeners.remove(listener);
}
具体某个监听器注册自己的逻辑
public ZookeeperRegistryPlugin(Container container) {
        this.container = container;
        container.registerAppListener(this);
}

监听器持有了container的引用。在构造函数里传入,并注册自己。

Why?

public void registerApplication(Application app) {
        this.applications.add(app);
        this.appListeners.forEach(i -> {
            try {
                i.appRegistered(new AppEvent(app, AppEventType.REGISTER));
            } catch (Exception e) {
                LOGGER.error(" Faild to handler appEvent. listener: {}, eventType: {}", i, AppEventType.REGISTER, e.getStackTrace());
            }
        });
}

这样,dapeng的事件驱动模型我们就分析完了。

总结

上一篇下一篇

猜你喜欢

热点阅读