發布訂閱是一種設計模式,它允許應用程式元件之間進行鬆散耦合。
其實訂閱發布設計中主要是發布者生成事件通道,用於在不了解任何訂閱者存在的情況下通知訂閱者。
當然委託eventhandlers和event關鍵字在此事件處理機制中擔任著重要的角色。下面我們來看看如何使用它們。
首先我們看乙個簡單地訂閱發布模式.
定義乙個action委託,無返回值.
namespace pubsubpattern
public
void
raise()
}}class
program
}}
如上**我們建立了乙個發布者,並且我們呼叫委託進行建立我們匿名方法來訂閱。由於委託提供了多播功能,因此我們可以onchange屬性上使用+=.
雖然說我們看著如上**執行無誤,但是程式中仍然存在一些問題,如果使用=
而不是+=
,那麼onchange屬性中將會刪除第乙個訂閱者。
由於onchange是公共屬性,因此該類的任何外部使用者都可以進行呼叫p.onchange()
.
下面我們來看看使用event關鍵字後的**
public
class
pub;
public
void
raise()
}class
program
}
通過如上**我們試著去解決我們第一處所說的問題,我們會發現使用event
關鍵字後可以保護我們onchange免受不必要的訪問。它不允許使用=
也就是說他不允許直接進行分配委託,因此我們現在可以避免使用=
,從而避免應用程式不必要的麻煩。
可能大家也會發現onchange初始化為空委託delegate{}
。這樣可以確保我們的onchange永遠不會為空。因為當我們其他進行對他呼叫的時候我們可以在**中進行刪除對他的非空檢查.
其實在訂閱發布中,發布者和訂閱者都不知道彼此的存在。有個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()
;}}
C 設計模式之訂閱發布模式
什麼是pub sub 發布訂閱是一種設計模式,它允許應用程式元件之間進行鬆散耦合。其實訂閱發布設計中主要是發布者生成事件通道,用於在不了解任何訂閱者存在的情況下通知訂閱者。當然委託eventhandlers和event關鍵字vb.net教程在此事件處理機制中擔任著重要的角色。下面我們來看看如何使用它...
C 設計模式之訂閱發布模式
發布訂閱是一種設計模式,它允許應用程式元件之間進行鬆散耦合。其實訂閱發布設計中主要是發布者生成事件通道,用於在不了解任何訂閱者存在的情況下通知訂閱者。當然委託eventhandlers和event關鍵字在此事件處理機制中擔任著重要的角色。下面我們來看看如何使用它們。首先我們看乙個簡單地訂閱發布模式....
js設計模式 發布訂閱模式
發布訂閱模式中有乙個註冊中心,有訂閱和發布方法,訂閱者需要帶著方法去訂閱乙個事件,當這個事件被發布時,訂閱者執行這個方法 import from lodash import from mntr current dimension description 註冊中心 author jsong laste...