码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-11-28 00:56:16      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:blog   http   ar   使用   sp   for   on   div   2014   

缘起

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

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

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

业务驱动通道

bubuko.com,布布扣

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

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

事件驱动

事件驱动包含三要素:

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

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

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

 

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

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

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

标签:blog   http   ar   使用   sp   for   on   div   2014   

原文地址:http://www.cnblogs.com/xiguain/p/4127502.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!