C#項(xiàng)目中常用到的設(shè)計(jì)模式_第1頁
C#項(xiàng)目中常用到的設(shè)計(jì)模式_第2頁
C#項(xiàng)目中常用到的設(shè)計(jì)模式_第3頁
C#項(xiàng)目中常用到的設(shè)計(jì)模式_第4頁
C#項(xiàng)目中常用到的設(shè)計(jì)模式_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C#項(xiàng)目中常用到的設(shè)計(jì)模式1 .引言個(gè)項(xiàng)目的通常都是從Demo開始,不斷為項(xiàng)目添加新的功能以及重構(gòu),也許剛開始的時(shí)候代碼顯得非常凌亂,毫無設(shè)計(jì)可言。但是隨著項(xiàng)目的迭代,往往需要將很多相同功能的代碼抽取出來,這也是設(shè)計(jì)模式的開始。熟練運(yùn)用設(shè)計(jì)模式應(yīng)該是每一個(gè)軟件開發(fā)人員的必備技能。今天給大家介紹幾個(gè)常用的設(shè)計(jì)模式。2 .單例模式單例模式恐怕是很多開發(fā)人員最先接觸到的模式之一,可以認(rèn)為就是一個(gè)全局變量。它的初始化過程無非就是一開始就new一個(gè)instance,或者惰性初始化等需要用到的時(shí)候new個(gè)instanceo這里需要注意的是在多線程情況下new一個(gè)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)元素。這里給出一個(gè)簡(jiǎn)單版的Stack實(shí)現(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)部實(shí)現(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工廠模式工廠模式細(xì)分的話有簡(jiǎn)單工廠模式、抽象工廠模式等。它最核心的就是如何通過Factory new個(gè)對(duì)象出來。在ASP.NETMVC消息處理實(shí)現(xiàn)過程中工廠模式運(yùn)用的非常多

8、。比如中處理一個(gè)Request,其實(shí)就是調(diào)用Controller下的在MVC個(gè)Action,這就需要從Uri和Route中反射出Controller對(duì)象,內(nèi)部由ControllerFactory創(chuàng)建。它的默認(rèn)實(shí)現(xiàn)是:DefaultControllerFactory另一個(gè)例子是ValueProviderFactory,它使得Controller下的Action能夠接收到前端傳回來的數(shù)據(jù)并實(shí)現(xiàn)模型綁定,是典型的抽象工廠實(shí)現(xiàn)。5.訂閱模式訂閱模式在某些項(xiàng)目運(yùn)用比較多,比如Knockout整個(gè)項(xiàng)目就是一個(gè)大的訂閱模式的實(shí)現(xiàn),但是它是用javascript編寫的。還有像微博、微信公眾號(hào)等等訂閱模式通常少

9、不了。通??梢远x接口:internalinterfaceISubjectlEnumerableObserversget;voidNotifyO;voidAddObserver(lObserverobserver);voidRemoveObserver(lObserverobserver);internalinterfacelObservervoidReceiveSubject(ISubjectsubject);實(shí)現(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 .責(zé)任鏈模式責(zé)任鏈模式?jīng)]有像工廠模式那樣被人熟悉,在ASP.NETWebApi中有一個(gè)非常典型的實(shí)現(xiàn)就是WebApi的消息處理管道HttpMessageHandler這里給一個(gè)簡(jiǎn)單的模擬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 .組合模式組合模式是使得單個(gè)對(duì)象和組合對(duì)象有致的行為,一致的行為可以理解為擁有同一個(gè)接口,比如圖形顯示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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論