事件驱动模型

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

观察者模式:

发布 - 订阅 , 变化 - 更新

事件驱动模型

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

2.事件驱动模型

事件源
  • 持有监听器列表,或者各种类型监听器
    • 可以只需要持有监听器的引用,在具体调用时,通过set将监听器实例set进去.
    • 这样做的目的时,不需要让事件源去提供注册和注销的api,直接通过set即可。
    //例子,以button为事件源
    public class Button {
        private ClickListener clickListener;
        private DbClickListener dbClickListener;
        // setter getter 省略
    }
    //具体使用时
    public class ButtonJsp {
        //持有事件源
        private Button button;
        
        public ButtonJsp() {
            button = new Button();
            button.setClickListener(new ClickListener(){
                public void click(ClickEvent event) {
                    System.out.println("do something")
                }
            });
        }
    }
    
  • 提供注册与注销api 给监听器注册(非必须,变种)
  • 触发事件,fireEvent
事件对象(AppEvent)
  • 可以定义各类事件
  • 必须持有事件源
  • 可以附带附加信息
监听器
  • 持有某个事件,监听事件
  • 定义行为,事件触发后会回调此行为
  • 向事件源注册和注销自己
Manager类
  • 保存事件源列表,在事件源的构造器中注册自己

    • 如果有多的事件源对象,此管理器可以很好的做到管理
    • 例如事件源是作者,而这里可以维护多个作者
    • 或者例如下文中dapeng框架里的多个Application
    public class Writer {
        private String name;
        private String novel;
        
        public Writer(String name) {
            this.name =this.name;
            Manager.getInstance().add(this);
        }
    }
    
  • 维护事件源的信息,拿到具体的事件源后,给监听器注册自己。

    • 例子,监听器读者监听作者Writer
      public void register(String writerName) {
          Manager.getInstance().getWriter(writeName).register(this);
      }
      

3.以dapeng-container为例

  • 3.1 监听器AppListener
public interface AppListener extends EventListener {

    public void appRegistered(AppEvent event);

    public void appUnRegistered(AppEvent event);
}

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

  • 3.2 事件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附加信息,作更进一步判断.

  • 3.3 事件源Application

一般情况下是事件源来持有监听器列表和注册注销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?

  • dapeng里面有很多application(每一个app目录下的app.jar就是一个应用服务。如app下的订单服务和会员服务,他们是分离开的。)
  • 之后,容器在注册了具体的application后,在application列表中加入当前的app
  • 接下来,遍历application列表,然后调用监听器自己的触发事件。
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的事件驱动模型我们就分析完了。

总结

  • dapeng里的Contaimer就相当于是一个Manger管理类,维护着事件源列表和监听器列表。
  • 它提供监听器和事件源来注册自己
  • 它作为一个代理,每当注册了一个app后,他会触发事件,然后遍历监听器列表,来发布事件
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,652评论 18 139
  • 事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型;理解它的几个关键点: 1.首先是一种对象...
    algernoon阅读 1,659评论 0 4
  • 事件驱动模型是Nginx服务器保障完整功能和具有良好性能的重要机制之一。 事件驱动模型概述 实际上,事件驱动并不是...
    吃瓜的东阅读 4,834评论 0 3
  • 所有的功能都要进行检测浏览器的兼容和功能实现。 1 .js是基于事件的处理程序。2 .事件流的含义:事件的响应式有...
    skoll阅读 481评论 0 0
  • 这是得有多久没有动笔写东西了,思绪很乱,说自己不知如何下笔,不如说是脑袋空空,哲学上讲:物质决定意识,是真真正确的...
    梦未凉阅读 256评论 0 0