邯郸网站设计公司排名,怎样做instergram网站营销,表白网站制作在线,简单的个人网站前言#xff1a;
观测者模型的基本理念#xff0c;就是#xff0c;我有一个公共的事件#xff0c;定义好他的事件的触发、数据接口。然后#xff0c;通过增加订阅者#xff08;实例#xff09;来订阅这个事件的#xff0c;或者说观察这个事件。如果事件发生#xff0…前言
观测者模型的基本理念就是我有一个公共的事件定义好他的事件的触发、数据接口。然后通过增加订阅者实例来订阅这个事件的或者说观察这个事件。如果事件发生订阅了事件或订阅了观察的类就执行这个时间的方法触发的执行。
这种方式的好处就是解耦了生产者事件发生和消费者事件处理的绑定关系注册观察了再执行否则不执行。 1 观察者发布-订阅模式的构建
1.1 EventHandler系统定义的事件委托Handler,也就是处理事件的方法 C# Formworks 定义的事件定义在 System.EventHandler 中的委托包括事件发送者和发送的事件数据对象两个参数。 2 定义数据事件提供者类
定义了一个名为 DataEventProvider 的公共静态类
2.1.1 定义事件 DataChanged和事件的句柄接口
数据事件提供者首先要有一个事件这里就是DataChanged。 public static class DataEventProvider{public static event EventHandlerDataChangedEventArgs DataChanged;public static void OnDataChanged(IFrameOut newFrame){DataChanged?.Invoke(null, new DataChangedEventArgs(newFrame));}} 有了事件DataChanged同时还提供一个事件的接口也就是你要通知订阅的人发生了声明然后给粗发生的事情的证据数据
也就是出事了然后有这么一堆数据来说明和准备处理、
EventArgs 就是来说明什么事件的但他默认的定义是空的就等着你构建事件的时候自己去定义需要哪些证据。
在我们的案例里面我们就把EventArgs给泛型也就是说明白了那么通过EventHandlerDataChangedEventArgs把接口泛型到DataChangedEventArgs的定义里面如下 public class DataChangedEventArgs : EventArgs{public IFrameOut NewFrame { get; } //拿到数据public DataChangedEventArgs(IFrameOut newFrame){NewFrame newFrame; // 给到事件订阅者}} 在DataChangedEventArgs里面我们清楚的定义了一个IFrame的图像的处理数据拿到数据同时把数据传递给事件订阅者作为事件要处理的接口。 【案】 public static event EventHandlerDataChangedEventArgs DataChanged; DataChanged 是一个公共的静态事件。 他的定义详细如下 1 public static类级别的公共静态变量 2 event类型:是一种特殊的成员允许对象订阅和响应由其他对象发出的信号或消息。 3 为 EventHandlerDataChangedEventArgs。 EventHandler 第一节已经说了DataChangedEventArgs是EventHandler的泛型版本表示事件处理方法EventHandler将接受DataChangedEventArgs泛型定义的参数这里我们的DataChangedEventArgs是我们自己定义的一个类。派生于EventArgs因此他也依旧包括EventHandler已经有的相关的数据。 总之我们的定义了一个 公共的静态事件类型为 EventHandlerDataChangedEventArgs。这意味着它可以与任何符合 EventHandler 委托定义的方法关联并且这些方法将接收一个 DataChangedEventArgs 类型的参数。 2.1.2 定义事件的方法 OnDataChanged 【案】 public static void OnDataChanged(IFrameOut newFrame) OnDataChanged 是一个静态方法 这里接受了一个IFrameOut的参数。 DataChanged?.Invoke(null, new DataChangedEventArgs(newFrame)); 这里DataChanged为之前定义的事件名 1 条件运算符 C# 6引入的null条件运算符。它允许你在尝试调用对象的成员之前检查对象这里为事件源对象或者观察者是否为null。如果对象不是null就执行成员访问如果是null则不执行任何操作并且表达式的结果为null。 这样做的另外一个好处是线程安全。 2 Invoke 方法 Invoke 是 EventHandler 委托的实例方法用于触发事件。它接受两个参数第一个是事件源通常是一个对象实例第二个是包含事件数据的 EventArgs 类型的实例。我们之前定义的时候知道DataChangedEventArgs泛型继承了之前EventHandler 有的两个基本数据。在这个例子中Invoke 被用来触发 DataChanged 事件通知所有订阅者发生了数据变化。 3 观察者发布-订阅模式的使用
3.1定义一个观测者事件
例如我们在Form1订阅了这个事件 private void OnDataChanged(object sender, DataChangedEventArgs e)
{// 拿到事件的参数数据IFrameOut frameOut e.NewFrame;// 后续进行处理}
3.2 注册一个观测者事件
事件的注册或者观测者通过将一个事件处理方法加到事件定义里面来注册 DataEventProvider.DataChanged OnDataChanged;3.3 触发一个事件发生 DataEventProvider.OnDataChanged(frameOut);3.4 取消观察 DataEventProvider.DataChanged - OnDataChanged;