事件处理

原创 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);
                     }
                 };
            }
        }
    }
}


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

相关文章推荐

跨浏览器事件处理程序

listview的事件处理

  • 2015-12-02 09:17
  • 2.39MB
  • 下载

WindowManager中悬浮窗的返回键事件处理

今天在优化公司指纹应用锁时遇到了这样一个问题:指纹应用锁锁住应用界面如何监听返回键,处理点击事件?下面来分析一下这个问题。   首先介绍一下指纹应用锁逻辑,首先把要锁的应用保存到数据库,开启指纹应用...

广播事件处理

  • 2014-09-13 18:04
  • 364KB
  • 下载

js-事件处理

1.鼠标单击事件 onclick: 鼠标单击事件,当在网页上单击鼠标时,就会发生该事件。同时onclick事件调用的程序块就会被执行,通常与按钮一起使用。 例如:           ...

数据库中堵塞事件处理

  • 2012-12-25 12:01
  • 675B
  • 下载

参考库4(事件处理)

事件处理 本章将描述iPhone OS系统中的事件类型,并解释如何处理这些事件。文中还将讨论如何在应用程序内部或不同应用程序间通过UIPasteboard类提供的设施进行数据的拷贝和粘贴,该类是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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