C#实现观察者模式
概念的東西我就不講了,網上一大堆,我們直接進入正題。假設有這樣一個場景:用戶輸入賬號、密碼,登錄成功后,需要給用戶發送一條短信并增加5積分,代碼如下:
相信很多人會這樣寫,包括我自己。這樣寫非常簡單,一般情況下也沒什么問題,但擴展性很差。比如我現在想加一個功能:登錄成功后需要記錄用戶IP等到日志中。這時我們又要再加一個LogService來處理,代碼如下:
這時我們發現不對勁了,這樣代碼耦合的太嚴重了,我們完全可以把登錄成功后的一堆業務封裝成單獨的模塊,用戶在登錄成功后,只要通知這個模塊就行了。代碼如下:
上面的代碼我就不多解釋了,實在太簡單了。主要就是定義一個訂閱接口:LoginSuccessObserver,外加三個實現類,每個實現類中取出封裝好的message參數進行對應的業務處理。我們再看下登錄的地方是怎么實現通知的(PS:期望不要太高,其實就一個for循環)。代碼如下:
上面的代碼相信大家都能看的懂,就是在UserController類中增加一個訂閱者列表:LoginSuccessObservers,然后登錄成功后,遍歷這個列表進行業務處理就行。由于對登錄業務沒有影響,所以我們上面另開了一個線程進行發送通知。然后下面有兩個方法:增加、刪除訂閱者。在調用的地方,只要按自己需要增加訂閱者就行了。代碼如下:
到此為止,觀察者模式我們就講完了,相信大家已經理解這個模式了。也許你會說你舉的例子怎么和我之前看到的不太一樣,委托呢?事件呢?你說的肯定是“水到100度就滴滴響”的例子。其實怎么說呢,用這種循環的方式,還是用事件委托的方式并不重要,重要的是你能辨別出場景。我們也可以給一個委托事件的版本,改造下,代碼如下:
其實就是用事件換掉原來的訂閱者列表,本質上是一樣,無非就是向事件或列表中添加訂閱者,我們再看下調用地方怎么改造。代碼如下:
這段我就不解釋了,相信大家都看的懂,最后我們來簡單總結一下:
觀察者模式本質上就是訂閱-發布模式,即一個對象內部發生了一件事,要通知給對這件事有興趣的對象列表。最重要的是要識別出誰是發布者(Subject),誰是訂閱者(Observer)。
上面的例子是在單個進程內通知,也可以使用消息隊列,比如RabbitMQ,進行多進程間的解耦。
今天講的內容非常簡單,如果能幫到你一點點,我就會很開心了,哈哈。
高冷地說聲拜拜~~
總結
- 上一篇: 使用Azure静态Web应用部署Blaz
- 下一篇: TIOBE 11 月榜单:Python