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


    前言

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

    事例一(分页功能)

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

       

         /// <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("不是新车不对订阅者发送通知!");
                }
            }
    }   

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

    总结

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

      

      曾经,我们懵懵懂懂地看完了狮子王,知道有个勇敢坚强的小狮子叫辛巴。

      现在,跨过山和大海,也走过人山人海,经历了跌跌撞撞,也遭遇了遗憾离别,我们才发现,其实辛巴就是我们每一个自己。

      25年前看懂的是剧情,25年后读懂的却是人生……

      推荐阅读:《狮子王》重映语录

      

                          c#基础知识详解系列

      欢迎大家扫描下方二维码,和我一起学习更多的C#知识

      

  • 相关阅读:
    数论基础(维诺格拉多夫著,裘光明译) 勘误
    微观经济学现代观点(Hal R. Varian) 复习题 1.1
    微分学里的中值定理
    数论基础(维诺格拉多夫著,裘光明译) 勘误
    分数的一种分拆方法
    C++正则表达式的初步使用
    如何用消息系统避免分布式事务
    阿里云表格存储全面升级,打造一站式物联网存储新方案
    探究 Java 应用的启动速度优化
    技术干货|基于Apache Hudi 的CDC数据入湖「内附干货PPT下载渠道」
  • 原文地址:https://www.cnblogs.com/hulizhong/p/11225948.html
Copyright © 2020-2023  润新知