.Net基础系列

委托与事件-委托事件案例(三)

2019-08-05  本文已影响0人  小世界的野孩子

前言

这两天一直在想如何结合实际案例来结束委托与事件的讲解,下面讲解两个事例,用来加深对委托及事件的理解。

事例一(分页功能)

本场景是用来讲解使用的,具体内容功能需自行填补实现。用委托加事件来实现分页功能的通用。按上一节讲解中的逻辑处理,分为订阅者和发布者,一样的可以先定义订阅者感兴趣的对象,然后发布者,订阅者。再就是主程序调用。

     /// <summary>
    /// 首先定义订阅者感兴趣的对象,本例感兴趣的是上一页下一页等方法。这里使用Action抽象 /// </summary>
    public class PageChangeEventArgs : EventArgs
    { public string Action { get; set; } public int PageIndex { get; set; } public PageChangeEventArgs() { } public PageChangeEventArgs(string action, int pageIndex)
        { this.Action = action; this.PageIndex = pageIndex;
        }
    } /// <summary>
    /// 定义发布者 /// </summary>
    public class PageActionPubliser
    { //定义委托
        public delegate void PageActionEventHandler(object sender, PageChangeEventArgs e); //定义委托类型的事件
        public event PageActionEventHandler PageAction; //定义保护方法判断委托事件是否为空,传入参数e类型为EventArgs
        protected void OnPageAction(PageChangeEventArgs e)
        { if (PageAction != null)
            {
                PageAction(this, e);
            } //PageAction?.Invoke(this, e);也可这样写
 } //编写触发事件、上一页
        public void PreviousClick( PageChangeEventArgs e)

        {
            OnPageAction(new PageChangeEventArgs("Previous",e.PageIndex));
        } //下一页
        public void NextClick( PageChangeEventArgs e)
        {
            OnPageAction(new PageChangeEventArgs("Next",e.PageIndex));
        }

    } /// <summary>
    /// 定义订阅者 /// </summary>
    public class Recevice
    { /// <summary>
        /// 具体分页内容的实现,订阅者 /// </summary>
        public static void BindPage(object sender, PageChangeEventArgs e)
        { //假设最大页数为10
            int MaxIndex = 10; if (e.PageIndex == 0 && e.Action == "Previous")
            { //当前0页,不能上一页
 } if (e.PageIndex == MaxIndex - 1 && e.Action == "Next")
            { //已是最后一页,不能下一页
 } switch (e.Action)
            { case "Previous":
                    e.PageIndex--; break; default:
                    e.PageIndex++; break;
            }
            Console.WriteLine($"已跳转到第{e.PageIndex}页");
        }

    } /// <summary>
        /// 这里使用的是控制台应用程序进行模拟 /// </summary>
        /// <param name="args"></param>
    class Program
    { static void Main(string[] args)
        { //绑定注册事件
            PageActionPubliser pageActionPubliser = new PageActionPubliser();
            pageActionPubliser.PageAction += Recevice.BindPage;
            Console.WriteLine("请选择上一页或者下一页:上一页(A)/下一页(B)"); string answer=Console.ReadLine();
            PageChangeEventArgs pageChangeEventArgs = new PageChangeEventArgs(); //假设当前页为5
            pageChangeEventArgs.PageIndex = 5; if (answer=="A")
            {                        
            pageActionPubliser.PreviousClick(pageChangeEventArgs);
            } else {
                pageActionPubliser.NextClick(pageChangeEventArgs);
            }

        }

    } 

在这里委托加事件的分页功能实现完成了。其实原理很简单的,当点击上一页或者下一页的时候,这时候因为因为已经绑定注册了这个事件。 它就会具体执行其中的操作。还是要具体去实践编写操作调试一下,就很快知道它的执行顺序、也能很快的掌握的。

事例二(新车到达提醒)

这个案例,简要的表述就是在车库中新到达了车辆时会对管理者发送通知。首先我们也先分析下。订阅者是管理者。订阅者感兴趣的对象是啥呢?感兴趣的对象是有没有新车达到。

然后,我们开始这个的一个设计。

    /// <summary>
    /// 定义订阅者感兴趣的对象 /// </summary>
    public class NewCarsEventArgs : EventArgs
    { public string NewCardName { get; set; } public NewCarsEventArgs() { } public NewCarsEventArgs(string newCardName)
        { this.NewCardName = newCardName;
        }
    } /// <summary>
    /// 定义发布者 /// </summary>
    public class NewCarsPublisher
    { public delegate void CarsEventHandler(object sender ,NewCarsEventArgs e); public event CarsEventHandler Cars; private void OnCars(NewCarsEventArgs e)
        { if (Cars!=null)
            {
                Cars(this,e);
            }
        } public void NewCarsArrivals(NewCarsEventArgs e)
        {
            OnCars(e);
        }
    } public class NewCarsRecevie
    { public static void Manager(object sender,NewCarsEventArgs e)
        {
            Console.WriteLine($"通知:新车{e.NewCardName}到了!");
        }
    } class Program
    { static void Main(string[] args)
        {
            NewCarsPublisher newCarsPublisher = new NewCarsPublisher();
            newCarsPublisher.Cars += NewCarsRecevie.Manager;
            Console.WriteLine("请输入到达车辆的名称:"); string name=Console.ReadLine();
            Console.WriteLine("到达车辆是否是新车(Y/N):"); string answer = Console.ReadLine(); if (answer=="Y")
            {
                NewCarsEventArgs newCarsEventArgs = new NewCarsEventArgs() { NewCardName=name};

               newCarsPublisher.NewCarsArrivals(newCarsEventArgs);
            } else {
                Console.WriteLine("不是新车不对订阅者发送通知!");
            }
        }
} 

谨记,事件基于委托,为委托提供了一种发布/订阅机制。理解发布订阅机制就会容易多了。一旦理清楚,发现好像也并不是很难的。多多消化一下,自己动手去想一下实例。去写一下。很快能掌握的。

总结

委托与事件到这里就大结局了。一些列的问题也解决了。心中的疑惑也揭开了。下面我们就接着基础系列写其他的了。

上一篇下一篇

猜你喜欢

热点阅读