前言
這兩天一直在想如何結(jié)合實(shí)際案例來(lái)結(jié)束委托與事件的講解,下面講解兩個(gè)事例,用來(lái)加深對(duì)委托及事件的理解。
事例一(分頁(yè)功能)
本場(chǎng)景是用來(lái)講解使用的,具體內(nèi)容功能需自行填補(bǔ)實(shí)現(xiàn)。用委托加事件來(lái)實(shí)現(xiàn)分頁(yè)功能的通用。按上一節(jié)講解中的邏輯處理,分為訂閱者和發(fā)布者,一樣的可以先定義訂閱者感興趣的對(duì)象,然后發(fā)布者,訂閱者。再就是主程序調(diào)用。
?
/// <summary> /// 首先定義訂閱者感興趣的對(duì)象,本例感興趣的是上一頁(yè)下一頁(yè)等方法。這里使用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> /// 定義發(fā)布者 /// </summary> public class
PageActionPubliser {//定義委托 public delegate void PageActionEventHandler(object
sender, PageChangeEventArgs e);//定義委托類(lèi)型的事件 public event PageActionEventHandler
PageAction;//定義保護(hù)方法判斷委托事件是否為空,傳入?yún)?shù)e類(lèi)型為EventArgs protected void
OnPageAction(PageChangeEventArgs e) {if (PageAction != null) { PageAction(this,
e); }//PageAction?.Invoke(this, e);也可這樣寫(xiě) } //編寫(xiě)觸發(fā)事件、上一頁(yè) public void
PreviousClick( PageChangeEventArgs e) { OnPageAction(new PageChangeEventArgs("
Previous",e.PageIndex)); } //下一頁(yè) public void NextClick( PageChangeEventArgs e)
{ OnPageAction(new PageChangeEventArgs("Next",e.PageIndex)); } } /// <summary>
/// 定義訂閱者 /// </summary> public class Recevice { /// <summary> /// 具體分頁(yè)內(nèi)容的實(shí)現(xiàn),訂閱者
/// </summary> public static void BindPage(object sender, PageChangeEventArgs
e) {//假設(shè)最大頁(yè)數(shù)為10 int MaxIndex = 10; if (e.PageIndex == 0 && e.Action == "Previous
") { //當(dāng)前0頁(yè),不能上一頁(yè) } if (e.PageIndex == MaxIndex - 1 && e.Action == "Next") { //
已是最后一頁(yè),不能下一頁(yè) } switch (e.Action) { case "Previous": e.PageIndex--; break;
default: e.PageIndex++; break; } Console.WriteLine($"已跳轉(zhuǎn)到第{e.PageIndex}頁(yè)"); } }
/// <summary> /// 這里使用的是控制臺(tái)應(yīng)用程序進(jìn)行模擬 /// </summary> /// <param
name="args"></param> class Program { static void Main(string[] args) { //綁定注冊(cè)事件
PageActionPubliser pageActionPubliser =new PageActionPubliser();
pageActionPubliser.PageAction+= Recevice.BindPage; Console.WriteLine("
請(qǐng)選擇上一頁(yè)或者下一頁(yè):上一頁(yè)(A)/下一頁(yè)(B)"); string answer=Console.ReadLine();
PageChangeEventArgs pageChangeEventArgs= new PageChangeEventArgs(); //假設(shè)當(dāng)前頁(yè)為5
pageChangeEventArgs.PageIndex =5; if (answer=="A") {
pageActionPubliser.PreviousClick(pageChangeEventArgs); }else {
pageActionPubliser.NextClick(pageChangeEventArgs); } } }
在這里委托加事件的分頁(yè)功能實(shí)現(xiàn)完成了。其實(shí)原理很簡(jiǎn)單的,當(dāng)點(diǎn)擊上一頁(yè)或者下一頁(yè)的時(shí)候,這時(shí)候因?yàn)橐驗(yàn)橐呀?jīng)綁定注冊(cè)了這個(gè)事件。
它就會(huì)具體執(zhí)行其中的操作。還是要具體去實(shí)踐編寫(xiě)操作調(diào)試一下,就很快知道它的執(zhí)行順序、也能很快的掌握的。
?
事例二(新車(chē)到達(dá)提醒)
這個(gè)案例,簡(jiǎn)要的表述就是在車(chē)庫(kù)中新到達(dá)了車(chē)輛時(shí)會(huì)對(duì)管理者發(fā)送通知。首先我們也先分析下。訂閱者是管理者。訂閱者感興趣的對(duì)象是啥呢?感興趣的對(duì)象是有沒(méi)有新車(chē)達(dá)到。
然后,我們開(kāi)始這個(gè)的一個(gè)設(shè)計(jì)。
? ??
/// <summary> /// 定義訂閱者感興趣的對(duì)象 /// </summary> public class NewCarsEventArgs :
EventArgs {public string NewCardName { get; set; } public NewCarsEventArgs() { }
public NewCarsEventArgs(string newCardName) { this.NewCardName = newCardName; }
}/// <summary> /// 定義發(fā)布者 /// </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($"通知:新車(chē){e.NewCardName}到了!"); } }
class Program { static void Main(string[] args) { NewCarsPublisher
newCarsPublisher= new NewCarsPublisher(); newCarsPublisher.Cars +=
NewCarsRecevie.Manager; Console.WriteLine("請(qǐng)輸入到達(dá)車(chē)輛的名稱:"); string name=
Console.ReadLine(); Console.WriteLine("到達(dá)車(chē)輛是否是新車(chē)(Y/N):"); string answer =
Console.ReadLine();if (answer=="Y") { NewCarsEventArgs newCarsEventArgs = new
NewCarsEventArgs() { NewCardName=name};
newCarsPublisher.NewCarsArrivals(newCarsEventArgs); }else { Console.WriteLine("
不是新車(chē)不對(duì)訂閱者發(fā)送通知!"); } } }
?
謹(jǐn)記,事件基于委托,為委托提供了一種發(fā)布/訂閱機(jī)制。理解發(fā)布訂閱機(jī)制就會(huì)容易多了。一旦理清楚,發(fā)現(xiàn)好像也并不是很難的。多多消化一下,自己動(dòng)手去想一下實(shí)例。去寫(xiě)一下。很快能掌握的。
總結(jié)
委托與事件到這里就大結(jié)局了。一些列的問(wèn)題也解決了。心中的疑惑也揭開(kāi)了。下面我們就接著基礎(chǔ)系列寫(xiě)其他的了。
曾經(jīng),我們懵懵懂懂地看完了獅子王,知道有個(gè)勇敢堅(jiān)強(qiáng)的小獅子叫辛巴。
現(xiàn)在,跨過(guò)山和大海,也走過(guò)人山人海,經(jīng)歷了跌跌撞撞,也遭遇了遺憾離別,我們才發(fā)現(xiàn),其實(shí)辛巴就是我們每一個(gè)自己。
?
25年前看懂的是劇情,25年后讀懂的卻是人生……
推薦閱讀:《獅子王》重映語(yǔ)錄
<https://mp.weixin.qq.com/s/4XBmM2YIKO12nhQkeJf08g?scene=25#wechat_redirect>
c#基礎(chǔ)知識(shí)詳解系列
<https://www.cnblogs.com/hulizhong/p/11205119.html>
?
歡迎大家掃描下方二維碼,和我一起學(xué)習(xí)更多的C#知識(shí)
?
熱門(mén)工具 換一換
