【第22期】观点:IT 行业加班,到底有没有价值?

事件处理

原创 2016年05月31日 11:36:31

-1-发布者和订阅者的设计模式(Publisher/Subscriber)

    当发布者发布一则讯息的时候,那么他的订阅者就都会收到此讯息,并进行相应的     判断。我们可以通过之前的委托类型来实现此功能。

-2-订阅者只需要将自己的委托处理方法加入到委托类型中即可。如果取消订阅,只需要从其中去除即可,比较简单,可以在定义委托对象时加上event,目的是为了让当前的订阅者不会影响到其他的订阅者。

下面是一段红绿灯为发布者,汽车为订阅者的模拟代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托的发布和订阅
{
    class Program
    {
        static void Main(string[] args)
        {
            TrafficLight light = new TrafficLight();
            Car car1 = new Car();
            Ambulance car2 = new Ambulance();
            car1.Enter(light);
            car2.Enter(light);
            light.changecolor();
            light.changecolor();
            car2.Emergent = true;
            light.changecolor();
            car1.Leave(light);
            light.changecolor();
        }
    }
    public delegate void LightEvent(bool color);
    public class TrafficLight
    {
        private bool color=false;
        public bool Color { get { return color; } }
        public event LightEvent  OnColorChange;
        public void changecolor()
        {
            color=!color;
            Console.WriteLine(color ? "红灯亮": "绿灯亮");
            if(OnColorChange !=null)
            {
                OnColorChange(color);
            }
        }
    }
    public class Car
    {
        private bool isRun=true;
        public void Enter(TrafficLight light)
        {
            light.OnColorChange  += car_color_change;
        }
        public void Leave(TrafficLight light)
        {
            light.OnColorChange -= car_color_change;
        }
        public virtual void car_color_change(bool color)
        {
            if(color&&isRun )
            {
                isRun = false;
                Console.WriteLine("{0}停车", this);
            }
            else if(!color&&!isRun)
            {
                isRun = true;
                Console.WriteLine("{0}启动", this);
            }
        }
    }
    public class Ambulance : Car
    {
        private bool emergent = false;
        public bool Emergent
        {
            get { return emergent; }
            set { emergent=value ; }
        }
        public override void car_color_change(bool color)
        {
            if (emergent) Console.WriteLine("{0}紧急通行", this);
            else base.car_color_change(color);
        }
    }
}

-3-使用EventHandler类

    在事件发布和订阅的过程中,定义事件的原型委托类型是一件重复性的工作,过       于麻烦,为此.NET类库中定义了一个EventHandler委托类型:

           public delegate void EventHandler (object sender,EventArgs e);

    其中sender顾名思义,引发事件的对象。

    e表示出了sender里的数据之外,还要发送给订阅者的讯息。

    使用的时候需要对其进行拆箱转换TrafficLight light = (TrafficLight)sender;

下面的程序还有了在事件中使用匿名的方法和EventHandler类型。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托的发布和订阅
{
    class Program
    {
        public delegate void EventHandler(object sender, EventArgs e);
        static void Main(string[] args)
        {
            TrafficLight light = new TrafficLight();
            Car car1 = new Car();
            //Car car2 = new Ambulance();
            car1.Enter(light);
            light.changecolor(60);
            light.changecolor(30);

        }
        public class Lighteventargs:EventArgs 
        {
            private int seconds;
            public int Seconds
            {
                get { return seconds; }
            }
            public Lighteventargs (int seconds)
            {
                this.seconds = seconds;
            }
        }
        public class TrafficLight
        {
            private bool color=false;
            public bool Color { get { return color; } }
            public event EventHandler OnColorChange;
            public void changecolor(int seconds)
            {
                color=!color;
                Console.WriteLine(color ? "红灯亮": "绿灯亮");
                if(OnColorChange !=null)
                {
                    OnColorChange(this, new Lighteventargs(seconds));
                }
            }
        }
        public class Car
        {
            private bool isRun=true;
            public virtual void Enter(TrafficLight light)
            {
                light.OnColorChange += delegate (object sender, EventArgs e)//匿名方法
                 {
                     if (light.Color)
                     {
                         isRun = false;
                         Console.WriteLine("{0}停车,{1}秒后启动", this, ((Lighteventargs )e).Seconds);
                     }
                     else
                     {
                         isRun = true;
                         Console.WriteLine("{0}启动,{1}秒后通过", this, ((Lighteventargs )e).Seconds);
                     }
                 };
            }
        }
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

16-Vue事件处理

Vue 提供了协助我们为标签绑定事件的方法,当我们可以直接用 DOM 原生的方式去绑定事件,绑定也非常方便,而且能让 viewmodel 更简洁,逻辑更彻底。 1. 监听事件的 Vue 处理 Vu...

js事件处理程序 Uncaught TypeError: Cannot read property 'addEventListener' of null

在写跨浏览器的事件处理程序时,遇到这个bug:Uncaught TypeError: Cannot read property 'addEventListener' of null ...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

OSG 事件处理机制 类图

本文为osg源码学习笔记,有理解不当之处,请随时指正.  PS: 本文参考osg 版本: 3.4.0 1. 事件处理框架 OSG的事件处理可分为两个大的模块.  1)  事件适配模块(类图右侧) ...

事件处理程序的几种方式总结

本文主要总结一下关于事件处理的几种方式。HTML事件处理程序这种方式即写在HTML代码中的,如点击该按钮就会弹出相应的对话框。 这种方式是将onclick作为元素属性,将执行的代码作为属性值来表达。...

Android:事件处理

一、事件概述  当用户在程序界面上执行各种操作时,应用程序必须为用户动作提供响应动作,这种响应动作需要通过事件处理来完成。Andorid提供了强大的事件处理机制,包括两套事件处理机制:  ...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)