搭个事件驱动的架子:前篇,缘起

缘起

之前的搭架子经验主要是基于【面向接口】的方式开发的,通过接口方式暴露业务规则和定义。依赖的层次与类库通过接口方式进行嫁接。

这种模式适合业务规格较清晰和归纳简单的模块,但是对于某些小粒度, 业务不易归纳的功能与模块来说,想要建立原则与约束就会变成奢望,因为很难抽离出明显的规则与约束。

这对于这点我们希望以纵向的管道方式进行隔离,取代横向的面向对象的建立业务。

业务驱动通道

之前的方式(右侧)为依据规则进行嫁接,左侧(黄色)则是通过建立业务驱动管道的方式进行衔接。特点是:在整个通道的一端进行事件触发,通道中进行业务校验,通道结果端接收业务过滤结果进行相应的操作。

后来思考了之后感觉思想有些像所谓的【事件驱动】。

事件驱动

事件驱动包含三要素:

事件源:能够接收外部事件的源体。

侦听器:能够接收事件源通知的对象。

事件处理程序:用于处理事件的对象。

查阅了一下,对于【事件驱动】使用最经典的是windows操作系统,最简单的理解就是,用户界面点击一个按钮,按钮是事件源(可以引发事务的物体),并产生事件参数Event,包含事件源信息;

整个系统中某些模块具有可以感知按钮点击点击的能力称之为【监听器】,监听器之前已经被声明为对于某种事件感兴趣,这样他会专门监听某种事件,有自己的实现。

事件本身拥有一个完整的声明周期,所以将事件联系起来就形成【事件集合】周期。

简单例子

简单的代码表面想法

   public interface DoEvent
    {
        String GetName();
    }

    public interface Listener
    {
        void HandleEvent(DoEvent e);
    }

    public interface EventSource
    {
        void addListerner(Listener l);
        void removeListerner(Listener l);
        void fireEvent(DoEvent e);
    }

声明时间三要素【事件源】,【监听器】,【事件管道】;

事件

    public class Click : DoEvent
    {
        public string GetName()
        {
            return "click";
        }
    }

    public class DoubleClick : DoEvent
    {

        public string GetName()
        {
            return "double click";
        }
    }

事件源,button是具有引发事件的事务

    public class Button:EventSource
    {
        private List<Listener> listeners=new List<Listener>(); 

        public void addListerner(Listener l)
        {
            listeners.Add(l);
        }

        public void removeListerner(Listener l)
        {
            listeners.Remove(l);
        }

        public void fireEvent(DoEvent e)
        {
            foreach (var listener in listeners)
            {
                listener.HandleEvent(e);
            }
        }
    }

事件管道监听者

    public class 台式机 : Listener
    {
        public void HandleEvent(DoEvent e)
        {
            System.Console.WriteLine("我属于台式机,名字是{0}", e.GetName());
        }
    }

    public class 笔记本 : Listener
    {
        public void HandleEvent(DoEvent e)
        {
            System.Console.WriteLine("我属于笔记本,名字是{0}", e.GetName());
        }
    }

    public class 手机 : Listener
    {
        public void HandleEvent(DoEvent e)
        {
            System.Console.WriteLine("我属于手机,名字是{0}", e.GetName());
        }
    }

调用

        static void Main(string[] args)
        {
            台式机 tai=new 台式机();
            笔记本 bi=new 笔记本();
            手机 shou=new 手机();

            Button btn=new Button();

            btn.addListerner(tai);
            btn.addListerner(bi);
            btn.addListerner(shou);

            btn.fireEvent(new Click());

            System.Console.WriteLine("------------------------");

            btn.removeListerner(shou);

            btn.fireEvent(new DoubleClick());

            System.Console.Read();
        }

更完整的思考与使用在以后继续介绍,这里只是引发个思考。

时间: 2024-10-07 05:20:05

搭个事件驱动的架子:前篇,缘起的相关文章

搭个事件驱动的架子:异步与效率

问题出现在我当前参与的系统中,本系统需要与公司已存在的多个子系统进行协作,整个架构类似这样: 上层Client,各种客户端 中层应用层,方便业务操作,进行业务整合,通过API与下层服务应用衔接,暴露接口为上层客户端提供数据. 下层服务层,单独部署的内部应用服务,不同部门自主管理. 最下层数据持久,公司自己开发的云部署环境,一次提交自动编译,自动发布. 问题 个人主要开发工作围绕应用层,需要对下层服务模块进行调用,但是由于历史遗留问题以及业务要求,每次应用层的操作(提交),需要跨模块进行数据校验,

从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十六 ║ Vue前篇:ES6初体验 &amp; 模块化

缘起 昨天说到了<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║ Vue前篇:JS对象&字面量&this>,通过总体来看,好像大家对这一块不是很感兴趣,嗯~~这一块确实挺枯燥的,不能直接拿来代码跑一下那种,不过还是得说下去,继续加油吧!如果大家对昨天的小demo练习的话,相信现在已经对JS的面向对象写法很熟悉了,如果嵌套字面量定义函数,如何使用this关键字指向.今天呢,主要说一下ES6中的一些特性技巧,然后简单说一下模块化的问题,好啦,开始今天的讲

【Linux】数据流重导向(前篇)

数据流重导向 (redirect) 由字面上的意思来看,好像就是将『数据给他传导到其他地方去』的样子? 没错-数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的地方,例如文件或者是装置 (例如打印机之类的)!这玩意儿在 Linux 的文本模式底下可重要的! 尤其是如果我们想要将某些数据储存下来时,就更有用了! 1)什么是数据流重导向? 什么是数据流重导向啊?这得要由命令的运行结果谈起!一般来说,如果你要运行一个命令,通常他会是这样的: 我们运行一个命令的时候,这个命令可

医疗时鲜资讯:医疗行业未来的变革(续前篇)

背景: 上周参加完展会后,有感而发,将以往自己所阅读的或者了解的关于目前医疗行业的部分时鲜资讯进行了总结分析.尤其是文末猜测了未来可能会发生变革的几大方向,最近在健康界等医疗热门媒体中又发现了与自己想法类似的文章,此处就不强调谁资浅资厚,不争论谁先谁后,仅就未来医疗行业的发展趋势,继续啰嗦几句. 医疗变革: 全科医生培训: 深圳商报的吴江[1]在"'家庭医生'服务实至名归还差什么?"一文中提到了家庭医生服务的概念.文中也提到了,在国外"'全科医生'其实就是'家庭医生'&quo

《1024伐木累》-小白篇之开发网站,三天!(前篇)-总章节八

往期回顾: 空军k所,老王留下迷惘的耗仔独自与吴博士沟通需求,回到公司,老王又指定耗仔为新项目负责人,在退居"二线"月侠的热心帮助下,耗仔重新调整工作计划,新来的明儿也即将加入,一切似乎都在顺风顺水的发展着,下班时,一通电话打破了平静局面,光大人,月侠,耗仔要火速赶往空军某部,三天时间开发航空某部网站.   小序 人生! 若白驹过隙,匆匆而已, 光阴似锦,无法倒流, 青春宝贵,奋斗无休, 北漂! 有激情,有迷茫,有机遇,有挑战, 不拼搏又何必留恋? 年轻,真好! 引子 “走,走,快!吴

WCF研究-前篇

前篇 1.从SOA说起 2.什么是WCF 3.WCF通信模型 4.Endpoint与ABC以及元数据 1.SOA (Service Oriented  Architecture) Ø 一种组件架构模型 Ø 主要特点 每个服务具有明确的服务边界. 服务独立,低耦合. 采用标准的契约定义和通信协议. 服务是自解释的. 2.WCF (Windows Communication  Foundation) Ø 是微软为SOA(Service-Oriented  Architecture)而设计的一套完整的

文本分类需要CNN?No!fastText完美解决你的需求(前篇)

http://blog.csdn.net/weixin_36604953/article/details/78195462?locationNum=8&fps=1 文本分类需要CNN?No!fastText完美解决你的需求(前篇) fastText是个啥?简单一点说,就是一种可以得到和深度学习结果准确率相同,但是速度快出几个世纪的文本分类算法.这个算法类似与CBOW,可爱的读着是不是要问CBOW又是个什么鬼?莫急,听小编给你慢慢到来,一篇文章,让你了解word2vec的原理,CBOW.Skip-

Java从零开始(前篇)

前篇 自述 本人大三通信专业,咸鱼一枚,对专业所学傅里叶变换等实在提不起兴趣. 幸好略学过c系列语言,但也浅尝辄止,浑浑噩噩,深入之后被指针弄地晕头转向. 想在毕业后转行计算机,于是我下定决心从零开始学习Java语言. 系统地学习,务实地记录.不怕头秃,干就完事. 目标 书籍与视频结合,每天至少花两个小时学习Java知识. 对每天所得所想加以记录,希望每天都能获取知识,提升自己. 对知识的梳理尚且不全面的,我会在后续进行补充纠正. 写在最后 Java学习系列博客用来给自己复习知识,构建知识体系.

Android应用进程启动过程(前篇)

相关文章 Android系统架构与系统源码目录 Android系统启动流程(一)解析init进程启动过程 Android系统启动流程(二)解析Zygote进程启动过程 Android系统启动流程(三)解析SyetemServer进程启动过程 Android系统启动流程(四)Launcher启动过程与系统启动流程 前言 在此前我讲过Android系统的启动流程,系统启动后,我们就比较关心应用程序是如何启动的,这一篇我们来一起学习Android7.0 应用程序进程启动过程,需要注意的是"应用程序进程