前言

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

事例一(分页功能)


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

   
/// <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年后读懂的却是人生……

  推荐阅读:《狮子王》重映语录
<https://mp.weixin.qq.com/s/4XBmM2YIKO12nhQkeJf08g?scene=25#wechat_redirect>

  

                      c#基础知识详解系列
<https://www.cnblogs.com/hulizhong/p/11205119.html>

 

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

 

  

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信