您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何用c#寫的聊天軟件)”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何用c#寫的聊天軟件)”吧!
責任鏈模式
責任鏈模式包含了一些命令對象和一系列的處理對象,每一個處理對象決定它能處理哪些命令對象,它也知道如何將它不能處理的命令對象傳遞給該鏈中的下一個處理對象。該模式還描述了往該處理鏈的末尾添加新的處理對象的方法。
責任鏈模式我們并不陌生,Netty中的ChannelHandler、Sentinel的Slot都有運用責任鏈模式。
Netty中的ChannelHandler責任鏈模式:
Sentinel中的Slot責任鏈模式:
舉例Netty與Sentinel的目的也在于這兩者在運用上存在些許區別,前者實現的是雙向傳遞的責任鏈,后者則是單向傳遞。兩者也存在共同點,都是使用鏈表將一系列處理對象連成責任鏈。
除了使用單向或者雙向鏈表方式實現責任鏈調用模式,還可以使用集合實現,將處理對象按順序放入集合中,通過遍歷集合方式調用。
過濾器、攔截器與責任鏈的關系
在23種設計模式中,并沒有對過濾器模式與攔截器模式單獨定義,在wiki上也只是將這兩者歸類為結構型設計模式。
無論是過濾器模式還是攔截器模式,在實現上,兩者都依賴責任鏈模式,因此,筆者將過濾器模式與攔截器模式看作是責任鏈模式的一種衍生模式,是責任鏈模式的一個變種,但不能使用等號。
過濾器模式是將所有過濾器對象構成鏈表,只要其中一個過濾器滿足條件,那么后續的過濾器將不會被調用,命令最終可由該過濾器處理。
過濾器的過濾方法一般返回boolean值,表示過濾或不過濾,當過濾方法返回值類型為void時,表示過濾器在決定過濾當前命令后,必須對該命令作出響應以結束命令處理。
過濾器模式對過濾器的調用順序并沒有嚴格要求,是否要求順序主要取決于具體的使用場景。
如需考慮優先級的黑白名單過濾器,順序不同結果截然不同;
如Shiro使用過濾器模式實現的認證授權功能。
(Shiro框架過濾器模式)
攔截器模式與過濾器模式大致相同,常見與動態代理模式結合使用,攔截器可以攔截方法調用(請求)或者改變方法調用(請求)傳遞的參數。
代理模式與委托模式的關系
參考維基百科:代理模式的目標是定義代理對象,該對象在客戶端和實際主體之間操作,以控制對真實主體的訪問,并在每次訪問真實主題時執行必要的任務。
代理模式也分動態代理和靜態代理,其中動態代理模式是使用最廣、最多的代理模式。代理模式也是使用最多的設計模式之一。
參考維基百科:委托模式是軟件設計模式中的一項基本技巧。在委托模式中,有兩個對象參與處理同一個請求,接受請求的對象將請求委托給另一個對象來處理。
代理模式與委托模式到底哪里不同也是飽受爭議。
在23種設計模式中并沒有對委托模式單獨定義,有人認為,委托模式只是代理模式的別稱,也有人認為,委托并不一定要調用相同方法,也不需要實現相同接口,而代理是代理一個方法或者一個接口的所有方法。
從定義上來看,兩者確實是不同的設計模式,對于上述兩種觀點,如果要論對錯,筆者更認可后者。
筆者曾經使用C#開發windows應用程序使用比較多的是委托模式,如處理一個日記事件,當監聽到日記時,委托一個類去將日記顯示到前端控件上,委托者委托受托者將日記顯示,兩者之間并沒有嚴格的約定。
(c#寫的聊天軟件)
組合模式與策略模式組合使用
組合模式也叫復合模式,復合模式描述一組對象,這些對象與相同類型對象的單個實例處理的方式相同。復合的目的是將對象"組合"到樹結構中,以表示部分整體層次結構。
通俗的理解,組合模式是將實現同一個接口的實例組合到一起,也可以將多個相同類型的組合組合到一起,構成一棵數。當外部調用這棵數的方法時,所有的葉子節點的方法都會被調用。
組合模式我們可能比較陌生,所以我們看一個實例來理解。
1、聲明組合中的對象接口:組件(Component),并提供接口實現類(Leaf);
2、定義具有組件行為的組合類,存儲組件、支持添加組件;
3、通過組合操作組合中的對象。
參考維基百科:策略模式指對象有某個行為,但是在不同的場景中,該行為有不同的實現算法。
組合模式與策略模式組合使用,在SpringBoot的web框架中非常常見,例如實現方法參數解析。
定義方法參數解析器(HandlerMethodArgumentResolver),HandlerMethodArgumentResolver即是策略模式中的策略接口(Strategy),也是組合模式中的組件(Component)。
組合模式將具有相同處理方式的對象組合到一起,也就是將所有方法參數解析器組合到一起。
策略模式根據方法參數的類型或者參數上的注解等選擇一個能夠解析該方法參數的解析器,由解析器從請求(數據包)中解析出方法參數。
HandlerMethodArgumentResolverComposite即是組合模式中的組合(Composite),也是策略模式中的Context。
RequestResponseBodyMethodProcessor負責解析被@ResponseBody注解注釋的方法參數、PathVariableMethodArgumentResolver負載解析被@PathVariable注解注釋的方法參數,這些都是組合模式中的葉子節點(Leaf),也是策略模式中的實體策略。
適配器模式
適配器模式的定義:適配器模式是使因接口不兼容而不能在一起工作的類能在一起工作,做法是將類自己的接口包裹在一個已存在的類中。
以實現支付結果回調失敗定時重試為例,假設現有兩種失敗定時重試實現方案:
一種是支持使用cron表達式的失敗定時重試;
另一種是支持自定義周期的失敗定時重試,如間隔2秒、4秒、8秒...后重試。
使用適配器模式將兩種方式組合到一起對外提供服務,并且做一些擴展。
對于外部調用者而言,只需要訪問一個接口就能獲得多種方式的支持,內部多種方式一起對外提供服務。
適應不同場景的使用方式
如何理解設計模式應當為適應不同場景作出改變?我們以封裝json序列化和反序列化工具為例。
在實際項目中,我們可以使用gson、Jackson等框架實現Java對象的序列化與反序列化,但一般我們不會同時使用多個,也不會存在面對不同的業務使用不同框架的情況。相反的,一般我們只會選擇其中一種,并且不會經常改變。
使用策略模式可以實現后期切換框架而不需要修改業務代碼,但這種場景下,我們真的需要教科書式的實現策略模式嗎。
最適合的方法應當是根據引入不同的框架決定使用哪種序列化策略,通過類加載實現“策略”,這種微妙的改變為封裝的組件提供了更智能的策略。
例如,我們在項目中添加gson的依賴后,整個項目的序列化和反序列化工作都將由gson完成,而當我們把依賴gson改為依賴Jackson時,整個項目的序列化和反序列化工作都將自動切換到Jackson。
感謝各位的閱讀,以上就是“如何用c#寫的聊天軟件)”的內容了,經過本文的學習后,相信大家對如何用c#寫的聊天軟件)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。