本篇文章講解關(guān)于路由事件的相關(guān)原理。
什么叫路由事件,字面理解就是事件是可以傳遞,路由的意思也好理解。路由事件其實(shí)就是,事件是會(huì)隨著某種變化,來(lái)回傳遞。路由事件其實(shí)在.NET2.0時(shí)期就已經(jīng)存在了,只不過(guò)在一般開(kāi)發(fā)過(guò)程中用不到。
從C#3.0開(kāi)始,就已經(jīng)封裝了關(guān)于路由事件的機(jī)制。其實(shí)這種實(shí)現(xiàn)應(yīng)該可以換個(gè)名字來(lái)解釋。我們可以給路由事件起個(gè)便于理解的名字,“事件的路由設(shè)計(jì)模式”。我們都知道,任何大的框架都是從微小的基本語(yǔ)法開(kāi)始編寫(xiě)的,平臺(tái)、語(yǔ)言給我們提供的僅僅是一些能滿足日常需求的東西;好東西還得我們自己去寫(xiě)、去創(chuàng)新。在常見(jiàn)的設(shè)計(jì)模式中,少不了對(duì)事件的使用,本人深有體會(huì)。是不是高手,不能用他會(huì)哪種框架、會(huì)哪種語(yǔ)言,而是要看他對(duì)他使用的語(yǔ)言所理解程度,能否將一門(mén)語(yǔ)言玩的爐火純青,能否寫(xiě)出高效、簡(jiǎn)單的框架;這才是高手。這也是很多初學(xué)者所喜歡犯的毛病。
路由事件在一些復(fù)雜的系統(tǒng)設(shè)計(jì)中至關(guān)重要,比如我有一個(gè)對(duì)象,這個(gè)對(duì)象是一個(gè)屬于容器類(lèi)的對(duì)象,就好比我們Windows應(yīng)用程序中的Form窗體,這個(gè)窗體用來(lái)承載一些其他的子窗體。然而這樣的遞歸性的設(shè)計(jì),經(jīng)常性的出現(xiàn)。我們?cè)诖罱ㄒ粋€(gè)界面時(shí),往這個(gè)界面上堆積了很多小的窗口。這些小的窗口又堆積了一些更小的窗口。在設(shè)計(jì)具有層次性的架構(gòu)時(shí),我們需要考慮這些對(duì)象不能被埋的太深,但是又要保持對(duì)象的結(jié)構(gòu)原理,就像下圖中所示;
1:

其實(shí)實(shí)現(xiàn)原理就是將事件向下傳遞,父控件要循環(huán)的判斷每一個(gè)子控件是否被訂閱了相關(guān)事件,如果父控件捕獲到的這個(gè)事件子控件也需要,那么就可以將事件向下路由了;
2:

如果我們需要框架支持路由事件的化,那么我們?cè)谇捌谠O(shè)計(jì)的時(shí)候,需要將對(duì)象進(jìn)行提取,對(duì)需要路由事件的對(duì)象進(jìn)行基類(lèi)封裝;就好比我們從Control控件的基類(lèi)開(kāi)始。
下面我們來(lái)看一個(gè)小例子,以幫助大家能理解原理,在自己開(kāi)發(fā)項(xiàng)目的時(shí)候能用的上。
一:容器對(duì)象代碼:
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace 路由事件
- {
- ///<summary>
- ///容器類(lèi)
- ///</summary>
- public class Container
- {
- ///<summary>
- ///鼠標(biāo)單擊事件
- ///</summary>
- public event EventHandlerClick;
- ///<summary>
- ///子對(duì)象集合
- ///</summary>
- private List<Child>childlist= new List<Child>();
- ///<summary>
- ///觸發(fā)當(dāng)前對(duì)象的Click事件
- ///</summary>
- public void OnClick()
- {
- Click( "父對(duì)象接受到Click事件" , null ); //觸發(fā)當(dāng)前父容器的事件
- foreach (Childc in childlist)
- {
- c.OnClick();
- }
- }
- ///<summary>
- ///添加子對(duì)象方法
- ///</summary>
- ///<paramname="c"></param>
- public void Add(Childc)
- {
- childlist.Add(c);
- }
- }
- }
二:子對(duì)象代碼:
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace 路由事件
- {
- ///<summary>
- ///子對(duì)象
- ///</summary>
- public class Child
- {
- ///<summary>
- ///鼠標(biāo)單擊事件
- ///</summary>
- public event EventHandlerClick;
- public void OnClick()
- {
- Click( "子對(duì)象接受到Click事件" , null );
- }
- }
- }
三:調(diào)用代碼:
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace 路由事件
- {
- class Program
- {
- static void Main( string []args)
- {
- Containercontainerobject= new Container();
- containerobject.Click+= new EventHandler(containerobject_Click);
- Childchildobject= new Child();
- childobject.Click+= new EventHandler(childobject_Click);
- containerobject.Add(childobject);
- if (Console.ReadLine()== "StartClick" )
- {
- containerobject.OnClick();
- }
- }
- static void childobject_Click( object sender,EventArgse)
- {
- Console.WriteLine((sender as string ));
- Console.ReadLine();
- }
- static void containerobject_Click( object sender,EventArgse)
- {
- Console.WriteLine((sender as string ));
- Console.ReadLine();
- }
- }
- }
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
