C 設計模式之訂閱發布模式

2021-10-13 07:29:20 字數 3031 閱讀 9733

什麼是pub-sub

發布訂閱是一種設計模式,它允許應用程式元件之間進行鬆散耦合。

其實訂閱發布設計中主要是發布者生成事件通道,用於在不了解任何訂閱者存在的情況下通知訂閱者。

當然委託eventhandlers和event關鍵字vb.net教程在此事件處理機制中擔任著重要的角色。下面我們來看看如何使用它們。

pub和sub的使用

首先我們看乙個簡單地訂閱發布

c#教程模式.

定義乙個action委託,無返回值.

namespace pubsubpattern

public

void

raise()

}}class

program

}}

如上**我們建立了乙個發布者,並且我們呼叫委託進行建立我們匿名方法來訂閱。由於委託提供了多播功能,因此我們可以onchange屬性上使用+=.

雖然說我們看著如上**執行無誤,但是程式中仍然存在一些問題,如果使用=而不是+=,那麼onchange屬性中將會刪除第乙個訂閱者。

由於onchange是公共屬性,因此該類的任何外部使用者都可以進行呼叫p.onchange().

使用event關鍵字的發布訂閱

下面我們來看看使用event關鍵字後的**

public class pub

;

public void raise()

class program

}通過如上**我們試著去解決我們第一處所說的問題,我們會發現使用event關鍵字後可以保護我們onchange免受不必要的訪問。它不允許使用=也就是說他不允許直接進行分配委託,因此我們現在可以避免使用=,從而避免應用程式不必要的麻煩。

可能大家也會發現onchange初始化為空委託delegate{}。這樣可以確保我們的onchange永遠不會為空。因為當我們其他進行對他呼叫的時候我們可以在**中進行刪除對他的非空檢查.

使用eventhandlers的發布訂閱

其實在訂閱發布中,發布者和訂閱者都不知道彼此的存在。有個eventhandler,它被稱為訊息**或者說事件匯流排,發布者和訂閱者都應該知道它,它接收所有傳入的訊息並且將它們進行**.

因此呢,在如下片段中我們使用eventhandler而不是用action.

public

delegate

void

eventhandler

(object sender,

eventargs e

)

預設情況下,eventhandler將傳送物件和一些事件引數作為引數。

public

class

myeventargs

:eventargs

public

myeventargs

(int

value)}

public

class

pub;

public

void

raise()

}class

program

}

如上**中通過pub類使用通用的eventhandler,它觸發eventhandler onchange時需要傳遞的事件引數型別,在上面**片段中為myargs

事件中的異常

我們繼續說一種情況.大家看如下**片段

public

class

myeventargs

:eventargs

public

myeventargs

(int

value)}

public

class

pub;

public

void

raise()

}class

program

; p.onchange +

=(sender, e)

=> console.

writeline

("sub 2.value:"

+ e.value)

; p.

raise()

; console.

writeline

("press enter !");

console.

readline()

;}}執行如上**後,大家會發現第乙個訂閱者已經執行成功了,第二個訂閱者引發了異常,而第三個訂閱者未被呼叫.這是乙個很尷尬的事情.

如果說我們覺得如上的過程不是我們預期的,我們需要手動引發事件並處理異常,這時候我們可以使用delegate基類中定義的getinvoctionlist來幫助我們實現這些。

我們繼續看如下**

public

class

myeventargs

:eventargs

public

myeventargs

(int

value)}

public

class

pub;

public

void

raise()

catch

(exception e)}if

(exceptions.

any())

}}class

program

; p.onchange +

=(sender, e)

=> console.

writeline

("sub 2.value:"

+ e.value)

; p.

raise()

; console.

writeline

("press enter !");

console.

readline()

;}}

reference

C 設計模式之訂閱發布模式

發布訂閱是一種設計模式,它允許應用程式元件之間進行鬆散耦合。其實訂閱發布設計中主要是發布者生成事件通道,用於在不了解任何訂閱者存在的情況下通知訂閱者。當然委託eventhandlers和event關鍵字在此事件處理機制中擔任著重要的角色。下面我們來看看如何使用它們。首先我們看乙個簡單地訂閱發布模式....

C 設計模式之訂閱發布模式

發布訂閱是一種設計模式,它允許應用程式元件之間進行鬆散耦合。其實訂閱發布設計中主要是發布者生成事件通道,用於在不了解任何訂閱者存在的情況下通知訂閱者。當然委託eventhandlers和event關鍵字在此事件處理機制中擔任著重要的角色。下面我們來看看如何使用它們。首先我們看乙個簡單地訂閱發布模式....

js設計模式 發布訂閱模式

發布訂閱模式中有乙個註冊中心,有訂閱和發布方法,訂閱者需要帶著方法去訂閱乙個事件,當這個事件被發布時,訂閱者執行這個方法 import from lodash import from mntr current dimension description 註冊中心 author jsong laste...