溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何用c#寫的聊天軟件)

發(fā)布時(shí)間:2021-12-22 11:28:06 來源:億速云 閱讀:247 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“如何用c#寫的聊天軟件)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何用c#寫的聊天軟件)”吧!

責(zé)任鏈模式

責(zé)任鏈模式包含了一些命令對象和一系列的處理對象,每一個(gè)處理對象決定它能處理哪些命令對象,它也知道如何將它不能處理的命令對象傳遞給該鏈中的下一個(gè)處理對象。該模式還描述了往該處理鏈的末尾添加新的處理對象的方法。

責(zé)任鏈模式我們并不陌生,Netty中的ChannelHandler、Sentinel的Slot都有運(yùn)用責(zé)任鏈模式。

Netty中的ChannelHandler責(zé)任鏈模式:

如何用c#寫的聊天軟件)

 

Sentinel中的Slot責(zé)任鏈模式:

如何用c#寫的聊天軟件)

舉例Netty與Sentinel的目的也在于這兩者在運(yùn)用上存在些許區(qū)別,前者實(shí)現(xiàn)的是雙向傳遞的責(zé)任鏈,后者則是單向傳遞。兩者也存在共同點(diǎn),都是使用鏈表將一系列處理對象連成責(zé)任鏈。

除了使用單向或者雙向鏈表方式實(shí)現(xiàn)責(zé)任鏈調(diào)用模式,還可以使用集合實(shí)現(xiàn),將處理對象按順序放入集合中,通過遍歷集合方式調(diào)用。

過濾器、攔截器與責(zé)任鏈的關(guān)系

在23種設(shè)計(jì)模式中,并沒有對過濾器模式與攔截器模式單獨(dú)定義,在wiki上也只是將這兩者歸類為結(jié)構(gòu)型設(shè)計(jì)模式。

無論是過濾器模式還是攔截器模式,在實(shí)現(xiàn)上,兩者都依賴責(zé)任鏈模式,因此,筆者將過濾器模式與攔截器模式看作是責(zé)任鏈模式的一種衍生模式,是責(zé)任鏈模式的一個(gè)變種,但不能使用等號。

過濾器模式是將所有過濾器對象構(gòu)成鏈表,只要其中一個(gè)過濾器滿足條件,那么后續(xù)的過濾器將不會(huì)被調(diào)用,命令最終可由該過濾器處理。

過濾器的過濾方法一般返回boolean值,表示過濾或不過濾,當(dāng)過濾方法返回值類型為void時(shí),表示過濾器在決定過濾當(dāng)前命令后,必須對該命令作出響應(yīng)以結(jié)束命令處理。

過濾器模式對過濾器的調(diào)用順序并沒有嚴(yán)格要求,是否要求順序主要取決于具體的使用場景。

如需考慮優(yōu)先級的黑白名單過濾器,順序不同結(jié)果截然不同;

如Shiro使用過濾器模式實(shí)現(xiàn)的認(rèn)證授權(quán)功能。

如何用c#寫的聊天軟件)

(Shiro框架過濾器模式)

攔截器模式與過濾器模式大致相同,常見與動(dòng)態(tài)代理模式結(jié)合使用,攔截器可以攔截方法調(diào)用(請求)或者改變方法調(diào)用(請求)傳遞的參數(shù)。

代理模式與委托模式的關(guān)系

參考維基百科:代理模式的目標(biāo)是定義代理對象,該對象在客戶端和實(shí)際主體之間操作,以控制對真實(shí)主體的訪問,并在每次訪問真實(shí)主題時(shí)執(zhí)行必要的任務(wù)。

代理模式也分動(dòng)態(tài)代理和靜態(tài)代理,其中動(dòng)態(tài)代理模式是使用最廣、最多的代理模式。代理模式也是使用最多的設(shè)計(jì)模式之一。

參考維基百科:委托模式是軟件設(shè)計(jì)模式中的一項(xiàng)基本技巧。在委托模式中,有兩個(gè)對象參與處理同一個(gè)請求,接受請求的對象將請求委托給另一個(gè)對象來處理。

代理模式與委托模式到底哪里不同也是飽受爭議。

在23種設(shè)計(jì)模式中并沒有對委托模式單獨(dú)定義,有人認(rèn)為,委托模式只是代理模式的別稱,也有人認(rèn)為,委托并不一定要調(diào)用相同方法,也不需要實(shí)現(xiàn)相同接口,而代理是代理一個(gè)方法或者一個(gè)接口的所有方法。

從定義上來看,兩者確實(shí)是不同的設(shè)計(jì)模式,對于上述兩種觀點(diǎn),如果要論對錯(cuò),筆者更認(rèn)可后者。

筆者曾經(jīng)使用C#開發(fā)windows應(yīng)用程序使用比較多的是委托模式,如處理一個(gè)日記事件,當(dāng)監(jiān)聽到日記時(shí),委托一個(gè)類去將日記顯示到前端控件上,委托者委托受托者將日記顯示,兩者之間并沒有嚴(yán)格的約定。

如何用c#寫的聊天軟件)

(c#寫的聊天軟件)

組合模式與策略模式組合使用

組合模式也叫復(fù)合模式,復(fù)合模式描述一組對象,這些對象與相同類型對象的單個(gè)實(shí)例處理的方式相同。復(fù)合的目的是將對象"組合"到樹結(jié)構(gòu)中,以表示部分整體層次結(jié)構(gòu)。

通俗的理解,組合模式是將實(shí)現(xiàn)同一個(gè)接口的實(shí)例組合到一起,也可以將多個(gè)相同類型的組合組合到一起,構(gòu)成一棵數(shù)。當(dāng)外部調(diào)用這棵數(shù)的方法時(shí),所有的葉子節(jié)點(diǎn)的方法都會(huì)被調(diào)用。

組合模式我們可能比較陌生,所以我們看一個(gè)實(shí)例來理解。

1、聲明組合中的對象接口:組件(Component),并提供接口實(shí)現(xiàn)類(Leaf);

如何用c#寫的聊天軟件)

2、定義具有組件行為的組合類,存儲(chǔ)組件、支持添加組件;

如何用c#寫的聊天軟件)

3、通過組合操作組合中的對象。

如何用c#寫的聊天軟件)

參考維基百科:策略模式指對象有某個(gè)行為,但是在不同的場景中,該行為有不同的實(shí)現(xiàn)算法。

組合模式與策略模式組合使用,在SpringBoot的web框架中非常常見,例如實(shí)現(xiàn)方法參數(shù)解析。

定義方法參數(shù)解析器(HandlerMethodArgumentResolver),HandlerMethodArgumentResolver即是策略模式中的策略接口(Strategy),也是組合模式中的組件(Component)。

如何用c#寫的聊天軟件)

組合模式將具有相同處理方式的對象組合到一起,也就是將所有方法參數(shù)解析器組合到一起。

策略模式根據(jù)方法參數(shù)的類型或者參數(shù)上的注解等選擇一個(gè)能夠解析該方法參數(shù)的解析器,由解析器從請求(數(shù)據(jù)包)中解析出方法參數(shù)。

HandlerMethodArgumentResolverComposite即是組合模式中的組合(Composite),也是策略模式中的Context。

如何用c#寫的聊天軟件)

RequestResponseBodyMethodProcessor負(fù)責(zé)解析被@ResponseBody注解注釋的方法參數(shù)、PathVariableMethodArgumentResolver負(fù)載解析被@PathVariable注解注釋的方法參數(shù),這些都是組合模式中的葉子節(jié)點(diǎn)(Leaf),也是策略模式中的實(shí)體策略。

適配器模式

適配器模式的定義:適配器模式是使因接口不兼容而不能在一起工作的類能在一起工作,做法是將類自己的接口包裹在一個(gè)已存在的類中。

以實(shí)現(xiàn)支付結(jié)果回調(diào)失敗定時(shí)重試為例,假設(shè)現(xiàn)有兩種失敗定時(shí)重試實(shí)現(xiàn)方案:

一種是支持使用cron表達(dá)式的失敗定時(shí)重試;

如何用c#寫的聊天軟件)

另一種是支持自定義周期的失敗定時(shí)重試,如間隔2秒、4秒、8秒...后重試。

如何用c#寫的聊天軟件)

使用適配器模式將兩種方式組合到一起對外提供服務(wù),并且做一些擴(kuò)展。

如何用c#寫的聊天軟件)

對于外部調(diào)用者而言,只需要訪問一個(gè)接口就能獲得多種方式的支持,內(nèi)部多種方式一起對外提供服務(wù)。

適應(yīng)不同場景的使用方式

如何理解設(shè)計(jì)模式應(yīng)當(dāng)為適應(yīng)不同場景作出改變?我們以封裝json序列化和反序列化工具為例。

在實(shí)際項(xiàng)目中,我們可以使用gson、Jackson等框架實(shí)現(xiàn)Java對象的序列化與反序列化,但一般我們不會(huì)同時(shí)使用多個(gè),也不會(huì)存在面對不同的業(yè)務(wù)使用不同框架的情況。相反的,一般我們只會(huì)選擇其中一種,并且不會(huì)經(jīng)常改變。

使用策略模式可以實(shí)現(xiàn)后期切換框架而不需要修改業(yè)務(wù)代碼,但這種場景下,我們真的需要教科書式的實(shí)現(xiàn)策略模式嗎。

最適合的方法應(yīng)當(dāng)是根據(jù)引入不同的框架決定使用哪種序列化策略,通過類加載實(shí)現(xiàn)“策略”,這種微妙的改變?yōu)榉庋b的組件提供了更智能的策略。

例如,我們在項(xiàng)目中添加gson的依賴后,整個(gè)項(xiàng)目的序列化和反序列化工作都將由gson完成,而當(dāng)我們把依賴gson改為依賴Jackson時(shí),整個(gè)項(xiàng)目的序列化和反序列化工作都將自動(dòng)切換到Jackson。

如何用c#寫的聊天軟件)

感謝各位的閱讀,以上就是“如何用c#寫的聊天軟件)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何用c#寫的聊天軟件)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI