缘起
之前的搭架子经验主要是基于【面向接口】的方式开发的,通过接口方式暴露业务规则和定义。依赖的层次与类库通过接口方式进行嫁接。
这种模式适合业务规格较清晰和归纳简单的模块,但是对于某些小粒度, 业务不易归纳的功能与模块来说,想要建立原则与约束就会变成奢望,因为很难抽离出明显的规则与约束。
这对于这点我们希望以纵向的管道方式进行隔离,取代横向的面向对象的建立业务。
业务驱动通道
之前的方式(右侧)为依据规则进行嫁接,左侧(黄色)则是通过建立业务驱动管道的方式进行衔接。特点是:在整个通道的一端进行事件触发,通道中进行业务校验,通道结果端接收业务过滤结果进行相应的操作。
后来思考了之后感觉思想有些像所谓的【事件驱动】。
事件驱动
事件驱动包含三要素:
事件源:能够接收外部事件的源体。
侦听器:能够接收事件源通知的对象。
事件处理程序:用于处理事件的对象。
查阅了一下,对于【事件驱动】使用最经典的是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