事件详解

事件概念

    事件的本质其实也是委托,只不过加了event关键字

语法:

public event 委托名 事件名

注意:  定义事件时,一般要有一个委托类型,用这个委托类型来定义处理事件的方法类型。注:笔者会在本文中提供两个思路


事件--委托和事件有什么联系和区别?
事件是委托的实例--事件是特殊的委托;

都可以+=/-=;
既然有了多播委托,为什么又搞个事件呢?
a.安全--事件是只能在类的内部执行;
b.就算是类的子类也不能执行当前类中的事件,只能由自己来执行;
c.事件从外面操作,只能有一个+=/-=;

 

为什么要用事件?事件究竟能干什么?
事件(观察者模式)能把固定动作和可变动作分开,完成固定动作,把可变动作分离出去,由外部控制
搭建框架时,恰好就需要这个特点,可以通过事件去分离可变动作,支持扩展

控件事件:
启动Form---初始化控件Button---Click事件---+=一个动作

点击按钮--鼠标操作--操作系统收到信号--发送给程序--程序得接受信号,判断控件--登陆--
(事件只能类的内部发生) Button类自己调用Click--肯定是触发了Click事件---登陆动作就会执行

点击按钮--鼠标操作--操作系统收到信号--发送给程序--程序得接受信号,判断控件--支付--
(事件只能类的内部发生) Button类自己调用Click--肯定是触发了Click事件---支付动作就会执行

2次按钮操作,大部分东西都是一样的,就是具体业务不一样的,
封装的控件就完成了固定动作--接受信号&默认动作。。。
可变部分,就是事件---是一个开放的扩展接口,想扩展什么就添加什么
event限制权限,避免外部乱来。

 

观察者模式三要素

1.事件发布者
发布事件并且在满足条件时触发事件
2订户
关注事件,事件发生后,自己做出对应的动作
3.订阅
把事件发布者和订户关联起来

 

实现代码

方式一(为事件定义委托,用这个委托类型来定义处理事件的方法类型)

    /// <summary>
    /// 事件发布者,满足条件触发事件
    /// </summary>
    public class MyEventTest
    {
        //为事件定义一个委托
        public delegate void aEventHandler();
        //定义事件(aEventHandler是委托名称)
        public event aEventHandler eventRun;


        /// <summary>
        /// 触发事件的方法
        /// </summary>
        public void TestRun() 
        {
            //触发的事件
            eventRun.Invoke();
            //或者eventRun(); 建议使用Invoke,看的清晰一点


        }
    }

    /// <summary>
    /// 订户:关注事件,事件发生后,做出自己的动作
    /// </summary>
    public class RunEventTest 
    {

        /// <summary>
        /// 定义处理事件的方法
        /// </summary>
        public void Run() 
        {
            Console.WriteLine("事件开始处理了");
        }
    
    }

//上端调用
MyEventTest myTest = new MyEventTest();//实例化事件发布者
RunEventTest RunEventTest = new RunEventTest();//实例化订户

//订阅:把事件和订户关联起来
myTest.eventRun += new MyEventTest.aEventHandler(RunEventTest.Run);
myTest.TestRun();

 

 

方式二(为事件封装特定的参数类型)

    public class EventStandard
    {
        /// <summary>
        /// 订阅: 把订户和事件关联
        /// </summary>
        public static void Show()
        {
            Lesson lesson = new Lesson()
            {
                Id = 123,
                Name = "冬季长款羽绒服",
                Price = 2699
            };
            //订阅:把订户和发布者的事件关联起来
            lesson.IncreaseHandler += new YongHu().Buy;

            lesson.IncreaseHandler += new ShangHu().Popularize;
            lesson.Price = 3999;
        }

    }



    /// <summary>
    /// 订户:关注事件,事件发生后,自己做出对应的动作
    /// </summary>
    public class YongHu
    {
        public void Buy(object sender, EventArgs e)
        {
            Lesson lesson = (Lesson)sender;
            Console.WriteLine($"This is {lesson.Name} Lesson");

            XEventArgs args = (XEventArgs)e;
            Console.WriteLine($"之前价格{args.OldPrice}");
            Console.WriteLine($"现在价格{args.NewPrice}");
            Console.WriteLine("果断买了!!!");
        }
    }
    /// <summary>
    /// 订户2:关注事件,事件发生后,自己做出对应的动作
    /// </summary>
    public class ShangHu
    {
        public void Popularize(object sender, EventArgs e)
        {
            Lesson lesson = (Lesson)sender;
            Console.WriteLine($"This is {lesson.Name} Lesson");

            XEventArgs args = (XEventArgs)e;
            Console.WriteLine($"之前价格{args.OldPrice}");
            Console.WriteLine($"现在价格{args.NewPrice}");
            Console.WriteLine("广大用户请留意!!!");
        }
    }

    /// <summary>
    /// 事件参数,一般会为事件封装特定的参数
    /// </summary>
    public class XEventArgs : EventArgs
    {
        public int OldPrice { get; set; }
        public int NewPrice { get; set; }
    }


    /// <summary>
    /// 事件的发布者,发布事件并且在满足条件的时候,触发事件
    /// </summary>
    public class Lesson
    {
        public int Id { get; set; }
        public string Name { get; set; }

        private int _price;
        //价格发生变化触发事件
        public int Price
        {
            get
            {
                return this._price;
            }
            set
            {
                if (value > this._price)
                {
                    this.IncreaseHandler?.Invoke(this,
                        new XEventArgs()
                        {
                           // OldPrice = this._price,
                            //NewPrice = value
                            OldPrice=value,
                            NewPrice=this._price
                        });
                    this._price = value;
                }
            }
        }

        /// <summary>
        /// 打折事件
        /// 
        /// </summary>
        public event EventHandler IncreaseHandler;

    }


//上端调用
EventStandard.Show();

 

posted @ 2023-01-17 21:54  唐什么来着  阅读(40)  评论(0编辑  收藏  举报