首页 > 代码库 > 搭个事件驱动的架子:前篇,缘起

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

缘起

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

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

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

业务驱动通道

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

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

事件驱动

事件驱动包含三要素:

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

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

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

 

查阅了一下,对于【事件驱动】使用最经典的是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();        }

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

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