2012-08-08 88 views
2

我正在閱讀和閱讀,但我仍然無法理解觀點,以及如何使用代表/活動和發佈者/訂戶?我知道委託是一個包含一個或多個方法引用的類,並且它用於將方法發送到另一個方法。與代表/活動和發佈者/訂閱者不理解觀點

我不明白的是我應該如何確定publischer/suubscriber的角色。我們舉個例子吧。 taxitntral和它的出租車。 taxisntral是發佈者和出租車的用戶,是否正在從taxitntral獲得駕駛訂單?但出租車也可能是出版商,並向那裏報告他們前往taxitntral的位置和地址,然後是出租車的用戶!?

我需要靈感,我正在尋找som初學者代碼來了解這是如何工作的。是否有人有幾分鐘的時間用一些簡單的代碼來回答這個問題?謝謝!

回答

2

另一種思考事件,發佈者/訂閱者等的方式是思考雲及其運作方式。在基於雲的系統中,任何實體都可以註冊以偵聽任何類型的事件,或者可以發佈任何它想要的事件。任何人在傾聽,都會得到這些數據。

在您的示例中:出租車中央可以發佈/推送事件,如輪班更改,交通事故(位置),出租車請求(位置)或其他類似的事情,整個出租車組將會聽。個人出租車將出版諸如Pickup At(Location),Drop Off(Location),Accident at(Location);中央將爲自己的目的登錄。其他出租車可以,如果他們還想要聽這些相同的事件,以便他們知道在哪裏和如何接近其他出租車到他們自己的位置,或者如果有另一個駕駛室報告或類似的事故。

但云事件是事件系統的特定實現。它更常見於特別訂閱事件。駕駛室對象在創建時會立即訂閱中央事件,而派遣駕駛室時的中央系統將確保它自己訂閱該出租車的事件。

這樣,兩個對象都起到發佈者和訂閱者的作用。它只針對單個事件。在我的示例中,PickupAt(Location)將由出租車發佈,並由Central訂閱。因此,對於那個事件,Cab是發佈者,並且Central是訂閱者。一般來說,誰擔任什麼角色完全取決於系統設計和正在創建的事件。它並不是真正可以推廣的東西,因爲如果你設置不同的事件,整個設置可能會改變,甚至會顛倒過來。我認爲這是最重要的部分。

代表作爲一個整體

在其最簡單的術語,代表是一種參考。它可以引用一個類,更常見的是它可以引用類中的方法,或者調用類中的方法。它甚至可以包含整個方法調用。它的確是一個非常多功能的對象,因爲它可以做很多事情。在事件的上下文中,委託實際引用對實現該事件的函數的調用。

public class c1 
{ 
    public event Eventhandler DoStuff; 

    public c1() 
    { 

    } 

    public void OnDoStuff() 
    {//this actually makes the event happen 
     if (DoStuff != null) 
      DoStuff(this, null); 
    } 
} 

public static void Main() 
{ 
    c1 x = new c1(); 
    x.DoStuff += new EventHandler(ThingFunction); 

    x.OnDoStuff();//this is how you would fire the event deliberately 
} 

public void ThingFunction(object sender, EventArgs x) 
{ 
    Console.WriteLine("Something Happened"); 
} 

C1包含事件DoStuff簡單事件代碼,主要支持這一活動。當代碼從任何地方調用x.OnDoStuff()時,如果您將x或其引用傳遞到實際代碼被處理的其他類中,這非常方便,然後處理程序返回主程序,無論調用x.OnDoStuff()多少層起源於,將執行。

確切地說,一旦創建了X,它就可以被傳遞到其他地方。只要某些功能分配給x.DoStuff,無論您何時何地調用方法x.OnDoStuff(),都將執行分配給x.DoStuff的功能。這就是事件訂閱的工作方式。 x.OnDoStuff()是發佈事件x.DoStuff的代碼調用,以及任何類...實際上任何數量的類,你都可以擁有多個訂閱者,將能夠捕獲已發佈的事件。

+0

感謝您的解釋!我想如果我還必須使用WPF窗口,它會更加複雜。出租車中央是主窗口,所有的出租車都有用於說明目的的用戶窗口。那麼我必須在小步驟中完成 – 2012-08-08 16:43:39

+0

在我的指導中,我將定義三個EventArgs信息類,它們是從EventArgs派生的?我不確定那是什麼意思?從EventArgs派生的部分? – 2012-08-08 16:56:50

+0

是這個家庭作業?如果是這樣,請添加作業標籤。您似乎有一組相當具體的要求... EventArgs是EventHander用來將參數傳遞到訂閱者函數的通用類。通過創建該類的自定義實現,您可以讓事件發佈比「DoStuff」更多的特定數據。您可以在「OnDoStuff」發佈呼叫中填充此數據。 – Nevyn 2012-08-08 17:03:41

0

您必須考慮「事件驅動」條款。在您的示例中,taxitntral和出租車可能都有發佈商角色,以及taxitntral和出租車的用戶角色。

例如,如果taxicentral有更新推送到所有的出租車,它可以有一個事件,它引發和出租車收聽。然後,出租車在他們接送某人時可能會舉行一次活動,並且稅務中心會聽取所有這些活動。

這有幫助嗎?

+0

嗯,也許,所以每一個可能的事件應該是一個自己的類或方法? – 2012-08-08 15:44:38

+0

代表是您創建的自定義事件。其中包含的事件,打包的數據,你想要的。這可能不是什麼超越,「嘿,事件發生了」,但它可能是,「事件發生了,它是#34號出租車」。然後,使用委託創建要觸發並捕獲的事件的每個實例。 – 2012-08-08 15:46:17

+0

我對一些簡單的代碼更瞭解嗎? – 2012-08-08 16:15:16

0

委託不用於向其他方法發送方法。它們用於調用在編譯時可能未知的方法。

讓我們來看一個簡單的例子。考慮一下,你寫一個計算器,用戶可以選擇參數和操作。該操作可以是執行計算的方法的委託。因此,您不必擔心如何存儲操作。此外,計算器不需要知道每個操作,因爲用戶將提供它。

代表的一個常見示例是回調函數。如果您在第二個線程中啓動了一個長期過程,則可能需要在線程完成時收到通知。您可以通過在過程完成時向被調用的線程提供委託來完成此操作。

活動是一種特殊類型的代表。當對象想要通知其他人狀態更改或類似操作時,可以使用它們。特別的是,對象本身並不需要知道哪些對象對變化感興趣。相反,這些對象訂閱事件。提供事件的對象只需調用事件的委託,並調用所有的用戶委託。由於賈斯丁C已經解釋過,出租車中央和出租車可以充當訂戶和出版商。這取決於誰對什麼感興趣。如果每個人都可以訂閱這些活動。如果只允許出租車中心獲取信息,則回撥方式更適合。

+0

感謝您的信息!不知道我該如何編碼?我找不到任何簡單的代碼示例。你能否展示一些代碼給我一些啓發? – 2012-08-08 15:54:35

相關問題