




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、C#項目中常用到的設(shè)計模式1 .引言個項目的通常都是從Demo開始,不斷為項目添加新的功能以及重構(gòu),也許剛開始的時候代碼顯得非常凌亂,毫無設(shè)計可言。但是隨著項目的迭代,往往需要將很多相同功能的代碼抽取出來,這也是設(shè)計模式的開始。熟練運用設(shè)計模式應(yīng)該是每一個軟件開發(fā)人員的必備技能。今天給大家介紹幾個常用的設(shè)計模式。2 .單例模式單例模式恐怕是很多開發(fā)人員最先接觸到的模式之一,可以認為就是一個全局變量。它的初始化過程無非就是一開始就new一個instance,或者惰性初始化等需要用到的時候new個instanceo這里需要注意的是在多線程情況下new一個instanceo通常加上lock可以解決問
2、題。這里我們利用C#的系統(tǒng)函數(shù)Interlocked.CompareExchangeinternalclassSingletonOneprivateSingletonOne_singleton;privateSlftitonOne()publicstaticSingletonOneInstancegetif(_singleton=null)Interlocked.CompareExchange(ref_singleton,newSingletonOne(),null);return_singleton;3 .迭代器模式迭代器模式也是用的比較多的一種,通常見于C#的內(nèi)置容器數(shù)據(jù)結(jié)構(gòu)List,St
3、ack等等,為了便于遍歷容器內(nèi)元素。這里給出一個簡單版的Stack實現(xiàn)lEnumerableint _index;internalclassStack:lEnumerable,privateT_array;privateprivateconstintDefaultSize=publicStack(int4;size)varsized=size0?size:DefaultSize;this._array=newthis._indexTsized;=0;publicintCountgetreturnthis._index;publicStack(lEnumerabledata):this(0)va
4、renumrator=data.GetEnumerator();while(enumrator.MoveNext()varitem=enumrator.Current;this.Push(item)public.voidPush(Titem)if(this._indexthis._array.Length)this._arraythis._index+elseitem;varnewLength=this._array.Length1;TnewArray=newTnewLength;Array.Copy(this._array,newArray,this.Count);this._array=n
5、ewArray;this.Push(item).PopOpublicTif(this.Count0)thrownewArgumentOutOfRangeException(5pop);elsethis._arraythis._indexreturndefault(T);this._array-this._index;publicTGet(intindex)index)if(this.CountthrownewArgumentOutOfRangeException(?Get);elsereturnthis._arrayindexJ;lEnumeratorlEnumerable.GetEnumer
6、ator()returnthis.GetEnumerator();publiclEnumeratorGetEnumerator()returnnewStackEnumerator(this);Stack的迭代器內(nèi)部實現(xiàn):internalclassStackEnumerator:lEnumeratorlEnumerator(privateStack_stack;privateintpublicStackEnumerator(Stack_index;stack)this._stack=stack;this._index=-publicboolMoveNext()1;thisindex+;retur
7、nthis. _stack. Count; public voidReset_indexthis. _index = 一1; lEnumerator. Currentthis.Current;)get return this. _stack. Get (this. _index) ;)Dispose ()nullobjectget return public T Currentthis. _stackpublic void4工廠模式工廠模式細分的話有簡單工廠模式、抽象工廠模式等。它最核心的就是如何通過Factory new個對象出來。在ASP.NETMVC消息處理實現(xiàn)過程中工廠模式運用的非常多
8、。比如中處理一個Request,其實就是調(diào)用Controller下的在MVC個Action,這就需要從Uri和Route中反射出Controller對象,內(nèi)部由ControllerFactory創(chuàng)建。它的默認實現(xiàn)是:DefaultControllerFactory另一個例子是ValueProviderFactory,它使得Controller下的Action能夠接收到前端傳回來的數(shù)據(jù)并實現(xiàn)模型綁定,是典型的抽象工廠實現(xiàn)。5.訂閱模式訂閱模式在某些項目運用比較多,比如Knockout整個項目就是一個大的訂閱模式的實現(xiàn),但是它是用javascript編寫的。還有像微博、微信公眾號等等訂閱模式通常少
9、不了。通常可以定義接口:internalinterfaceISubjectlEnumerableObserversget;voidNotifyO;voidAddObserver(lObserverobserver);voidRemoveObserver(lObserverobserver);internalinterfacelObservervoidReceiveSubject(ISubjectsubject);實現(xiàn):internalclassAritcleObserver:lObserverpublicvoidReceiveSubject(ISubjectsubject)/receiveth
10、esubjectclassWeChatArticle:ISubjectprivateICollection_observers;privatestring_name;publicWeChatArticle(stringname)this._name=name;this._observers=newList();publiclEnumerableObserversgetreturnforeach(lObserverobserverinthis._observers)observer.ReceiveSubject(this);publicvoidAddObserver(lObserverobser
11、ver)this._observers.Add(observer);publicvoidRemoveObserver(lObserverobserver)this._observers.Remove(observer);6 .責任鏈模式責任鏈模式?jīng)]有像工廠模式那樣被人熟悉,在ASP.NETWebApi中有一個非常典型的實現(xiàn)就是WebApi的消息處理管道HttpMessageHandler這里給一個簡單的模擬classDataRequestpublicstringFileNameget;set;classDataResponsepublicstring Error get; set; publi
12、c string Data get;set;internalabstractclassRequestHandlerpublicRequestHandlerNextHandlerget;set;publicabstractDataResponseProcess(DataRequestrequest);classReadRequestHandler:RequestHandlerpublicoverrideDataResponseProcess(DataRequestrequest)returnnewDataResponse()Data=File.ReadAllText(request.FileNa
13、me)classExistsRequestHandler:RequestHandlerpublicoverrideDataResponseProcess(DataRequestrequest)if(File.Exists(request.FileName)returnthis.NextHandler.Process(request);elsereturnnewDataResponse()Error=noexists5);7 .組合模式組合模式是使得單個對象和組合對象有致的行為,一致的行為可以理解為擁有同一個接口,比如圖形顯示classControlContextinternalinterfaceIControl void Draw(ControlContextcontext); class Line : IControl publicvoidDraw(ControlContextcontext)class Circle : IControl Draw(ControlContext context)CompositeControl : IControlpublic void classprivateListcontrols;publicCompositeControl(IListcons)this.controls=newList(con
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國篩分設(shè)備行業(yè)發(fā)展前景預測及投資方向研究報告
- 2025至2030年中國鄉(xiāng)村旅游特色村市場深度分析及投資戰(zhàn)略咨詢報告
- 2025至2030年中國券商自營行業(yè)市場調(diào)查研究及投資前景預測報告
- 2025至2030年中國光接入系統(tǒng)設(shè)備行業(yè)發(fā)展前景及投資戰(zhàn)略咨詢報告
- 2025至2030年中國3D電影行業(yè)競爭格局分析及投資戰(zhàn)略咨詢報告
- 2025至2030年中國醫(yī)藥零售行業(yè)市場調(diào)查研究及投資前景預測報告
- MySQL數(shù)據(jù)庫應(yīng)用實戰(zhàn)教程(慕課版)(第2版)實訓指導-9-4 主從同步配置
- 統(tǒng)編版語文七年級上冊第二單元測試卷(含答案)
- 小型醫(yī)療廢物采購合同范本
- 三方協(xié)議如何解簽合同書
- 委托舞臺編導合同(2025年版)
- 2025-2030年UV固化設(shè)備項目商業(yè)計劃書
- 質(zhì)保部工作流程
- 2025年舟山市專業(yè)技術(shù)人員公需課程-全面落實國家數(shù)字經(jīng)濟發(fā)展戰(zhàn)略
- 變電站全壽命周期管理-深度研究
- Qt 5 開發(fā)及實例(第5版) 課件 第10章 Qt 5網(wǎng)絡(luò)通信及實例
- 靜脈血栓栓塞癥VTE防治管理手冊
- 《工貿(mào)企業(yè)粉塵防爆安全規(guī)定》知識培訓
- 蔬菜配送司機勞務(wù)合同
- 建筑工程EPC項目管理
- 妊娠期肝內(nèi)膽汁淤積癥臨床診治和管理指南(2024版)解讀課件
評論
0/150
提交評論