實(shí)訓(xùn)設(shè)計(jì)與模式當(dāng)你開始學(xué)習(xí)這本書時(shí)應(yīng)該已經(jīng)寫過上萬行代碼了吧_第1頁
實(shí)訓(xùn)設(shè)計(jì)與模式當(dāng)你開始學(xué)習(xí)這本書時(shí)應(yīng)該已經(jīng)寫過上萬行代碼了吧_第2頁
實(shí)訓(xùn)設(shè)計(jì)與模式當(dāng)你開始學(xué)習(xí)這本書時(shí)應(yīng)該已經(jīng)寫過上萬行代碼了吧_第3頁
實(shí)訓(xùn)設(shè)計(jì)與模式當(dāng)你開始學(xué)習(xí)這本書時(shí)應(yīng)該已經(jīng)寫過上萬行代碼了吧_第4頁
實(shí)訓(xùn)設(shè)計(jì)與模式當(dāng)你開始學(xué)習(xí)這本書時(shí)應(yīng)該已經(jīng)寫過上萬行代碼了吧_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1以及怎么做,設(shè)計(jì)能力的缺失導(dǎo)致了大量冗余、低效、充滿Bug且不易的代碼,甚至在更短的時(shí)間內(nèi)編寫出更高質(zhì)量的代碼。有統(tǒng)計(jì)數(shù)據(jù),一個(gè)高級(jí)程序員與一個(gè)平庸程10:1,顯然企業(yè)更愿意使用高級(jí)程序員以節(jié)省成本。1拿到了別人的代碼要在其基礎(chǔ)上修改以添加功能這時(shí)發(fā)現(xiàn)原來的代碼結(jié)構(gòu),bug。在重構(gòu)領(lǐng)域,最具的著作當(dāng)數(shù)MartinFowler所寫的《重構(gòu)——改善既有代碼的重構(gòu)的各種技術(shù)。 2MartinFowler下面展示了一個(gè)簡(jiǎn)單的個(gè)人所得據(jù)打印的例子。Tax類代表申信息,包括了,月收入兩個(gè)屬性,ReportPrintusingnamespace{publicclass{privatestringname;publicstringName{get{returnname;}set{name=value;}}privatedoublesaraly;publicdoubleSaraly{get{returnsaraly;}set{saraly=value;}}public{}publicTax(stringname,double{=name;this.saraly=}}}代碼演示:重構(gòu)前——ReportusingnamespaceCom.{publicclass{publicvoidPrint(Tax{ ine("個(gè)人所得稅申報(bào)收據(jù)Console.Write("申報(bào)日期:"+DateTime.Now.ToString("yyyy-MM-dd")); ine("\t操作人:"); ine("繳稅人:\t{0}",tax.Name); ine("繳稅人月收入:\t{0:c2}元",tax.Saraly);intlevel=0;if(tax.Saraly>2000)level=1;if(tax.Saraly>4000)level=

if(tax.Saraly>6000)level=3;if(tax.Saraly>8000)level=4;if(tax.Saraly>10000)level=5; ine("應(yīng)繳稅級(jí)別:\tlevel級(jí)");doublet=0;switch{caset=case1:t=tax.Saraly*0.05;caset=tax.Saraly*0.08;caset=tax.Saraly*0.10;caset=tax.Saraly*0.15;caset=tax.Saraly*0.20;} }}}usingnamespaceCom.{publicclass{publicstaticvoidMain(string[]{Taxtax=newTax("",3500);Reportreport=newReport();}}}圖 重構(gòu)第一次重構(gòu):拆分大方PrintPrintHeader和PrintContent兩個(gè)方法,將大的方法拆分為小的方法,可以增加方法被復(fù)用的機(jī)率,每個(gè)方Report類代碼如下:usingnamespaceCom.{publicclass{publicvoidPrint(Tax{}publicvoid{ ine("個(gè)人所得稅申報(bào)收據(jù)Console.Write("申報(bào)日期:"+DateTime.Now.ToString("yyyy-MM-dd")); ine("\t操作人:"); }

publicvoidPrintContent(Tax{ ine("繳稅人:\t{0}",tax.Name); ine("繳稅人月收入:\t{0:c2}元",tax.Saraly);intlevel=0;if(tax.Saraly>2000)level=1;if(tax.Saraly>4000)level=2;if(tax.Saraly>6000)level=3;if(tax.Saraly>8000)level=4;if(tax.Saraly>10000)level=5; ine("應(yīng)繳稅級(jí)別:\tlevel級(jí)");doublet=0;switch{caset=case1:t=tax.Saraly*0.05;caset=tax.Saraly*0.08;caset=tax.Saraly*0.10;caset=tax.Saraly*0.15;caset=tax.Saraly*0.20;} ine("應(yīng)繳收稅額:\t{0:c2}元}}}第二次重構(gòu):方法只實(shí)現(xiàn)單PrintConent方法,其中包含了打式改變后不會(huì)影響到打印功能,改變Report類代碼如下:usingnamespaceCom.{publicclass{publicvoidPrint(Tax{}publicvoid{ ine("個(gè)人所得稅申報(bào)收據(jù)Console.Write("申報(bào)日期:"+DateTime.Now.ToString("yyyy-MM-dd")); ine("\t操作人:"); }

publicvoidPrintContent(Tax{ ine("繳稅人:\t{0}",tax.Name); ine("繳稅人月收入:\t{0:c2}元",tax.Saraly);intlevel=CountLevel(tax); ine("應(yīng)繳稅級(jí)別:\tlevel級(jí)");doublet=CountTax(tax,level); ine("應(yīng)繳收稅額:\t{0:c2}元}publicintCountLevel(Tax{intlevel=if(tax.Saraly>2000)level=1;if(tax.Saraly>4000)level=2;if(tax.Saraly>6000)level=3;if(tax.Saraly>8000)level=4;if(tax.Saraly>10000)level=5;returnlevel;}publicdoubleCountTax(Taxtax,int{doublet=0;switch{caset=case1:t=tax.Saraly*0.05;caset=tax.Saraly*0.08;caset=tax.Saraly*0.10;caset=tax.Saraly*0.15;caset=tax.Saraly*0.20;}return}}}第三次重構(gòu):方法按邏輯歸能。ReportReport類中只應(yīng)該包含打印相關(guān)的方法稅務(wù)相關(guān)的方法應(yīng)該轉(zhuǎn)移到Tax類中觀察下面更改后的TaxReport類的代碼,會(huì)發(fā)現(xiàn)將方法轉(zhuǎn)移到應(yīng)該歸屬的類后,方法的參數(shù)也變得更加簡(jiǎn)單:usingnamespaceCom.{publicclass{privatestringname;publicstringName{get{returnname;}set{name=value;}}privatedoublesaraly;publicdoubleSaraly{get{returnsaraly;}set{saraly=value;}}public{}publicTax(stringname,double{=name;this.saraly=}publicint{intlevel=if(this.Saraly>2000)level=1;if(this.Saraly>4000)level=2;if(this.Saraly>6000)level=3;if(this.Saraly>8000)level=4;if(this.Saraly>10000)level=5;returnlevel;}publicdouble{doublet=switch(CountLevel()){caset=case1:t=this.Saraly*0.05;caset=this.Saraly*0.08;caset=this.Saraly*0.10;caset=this.Saraly*0.15;caset=this.Saraly*0.20;}return}}}usingnamespaceCom.XinZhanedu.{publicclass{publicvoidPrint(Tax{}publicvoid{ ine("個(gè)人所得稅申報(bào)收據(jù)Console.Write("申報(bào)日期:"+DateTime.Now.ToString("yyyy-MM-dd")); ine("\t操作人:"); }

publicvoidPrintContent(Tax{ ine("繳稅人:\t{0}",tax.Name); ine("繳稅人月收入:\t{0:c2}元",tax.Saraly); ine("應(yīng)繳稅級(jí)別:\t{0}級(jí)",tax.CountLevel()); ine("應(yīng)繳收稅額:\t{0:c2}元",tax.CountTax());}}}第四次重構(gòu):替換switch語句:usingnamespace{publicclass{privatestringname;publicstringName{get{returnname;}set{name=value;}}privatedoublesaraly;publicdoubleSaraly{get{returnsaraly;}set{saraly=value;}}public{}publicTax(stringname,double{=name;this.saraly=}privatedouble[]rates=newdouble[]{0,0.05,0.08,0.1,0.15,publicint{intlevel=if(this.Saraly>2000)level=1;if(this.Saraly>4000)level=2;if(this.Saraly>6000)level=3;if(this.Saraly>8000)level=4;if(this.Saraly>10000)level=5;returnlevel;}publicdouble{returnthis.Saraly*}}}MartinFowlerMartinFowler的帶領(lǐng)下更深入的了解重構(gòu)的各種吧(在課件的“代碼演示”中有《重構(gòu)》一書的免費(fèi)章節(jié)和96K追求的則是可性。2002年曾經(jīng)有人對(duì)的商業(yè)應(yīng)用程序進(jìn)行過統(tǒng)計(jì),在軟件開發(fā)上每投入1,就將花費(fèi)2用于。也就是說軟件的代價(jià)是開發(fā)的2倍,從企ABR類的代碼,AR類的代碼。B類的業(yè)務(wù)并沒有變化,但對(duì)R類所做的修改同樣反映到了B類,反而使B類原有的業(yè)務(wù)需開放封閉原則(OCP原則開放封閉原則(OpenClosedPrinciple)BertrandMeyer博士提出,是所有類的設(shè)計(jì)OCP原則演化而來。BertrandOCPsoftwareentities(classes,modules,functions,etc.)shouldbeopenforextension,butclosedformodification.軟件實(shí)體(類,模塊,方法等)OCPOCPOCPpublicclass{publicvoid{ }publicvoid{ }}ShapeDemoOCP原則,無論是修改已有的畫圖功能還是擴(kuò)展新的功能(比 { void}publicclassCircle {publicoverridevoid{ }}publicclassSquare {publicoverridevoid{ }}OCP原則,首先需要修改已有的畫圖功能時(shí)不會(huì)影響其他類,其次OCPC#語言O(shè)CPC#的多態(tài)層定義的方法OCP下面我們?cè)偻ㄟ^一個(gè)生活中的實(shí)例來進(jìn)一步說明這個(gè)問題,比如:家剛裝完了插座,很方便,當(dāng)然可能不好看…….NetFrameworkOCPIEnumerable接口作為抽象層定義了集合的外部特征,Hashtable、SortedList等作為實(shí)現(xiàn)類提供了不同的內(nèi)在特性,如果需要IEnumerable接口即可。IO流、異常結(jié)構(gòu)等設(shè)計(jì)。依賴倒轉(zhuǎn)原則(DIP原則抽象耦合:一個(gè)類另一個(gè)抽象類或接口,稱之為抽象耦合具體耦合:一個(gè)類直接另一個(gè)具體類,稱之為具體耦合OCP原則,一個(gè)類產(chǎn)生變化時(shí)往往會(huì)波及到相耦合DIP原則中有如下兩段描述:High-levelmodulesshouldnotdependonlow-levelmodules.Bothshoulddependon高等級(jí)模塊不應(yīng)依賴于級(jí)模塊,而應(yīng)依賴于抽象層Programtoaninterface,notan針對(duì)接口(抽象層)針對(duì)接口編程指應(yīng)當(dāng)使用接口或抽象類進(jìn)行變量類型參數(shù)類型或方法返回類型,而不是使用具體實(shí)現(xiàn)類。比如定義集合時(shí)應(yīng)使用IListlist=newArrayList()這種形式ArrayListv=newArrayList(),前者提供了更高的靈活性。接口分離原則(ISP原則接口分離原則(InterfaceSegregationPrinciple)關(guān)注與接口的設(shè)計(jì),要求使用多個(gè)ISPISPAppleiPod系列產(chǎn)品,第一版中我們讓所有的iPod系列器都實(shí)現(xiàn)同一接口:1對(duì)iPod這種設(shè)計(jì)存在兩個(gè)缺陷,首先并非所有的iPod都具有(shuffle不可以)和觸法將各個(gè)產(chǎn)品區(qū)分開,如設(shè)計(jì)一個(gè)方法傳入可的iPod對(duì)其進(jìn)行操作,方法參數(shù)只2ISP最少知識(shí)原則(LKP原則Demeter,比如A類提供了Exit(退出程序)方法,但A實(shí)例的獲取比較麻煩,為簡(jiǎn)化操作,B類ExitBA類。,通用閉命名空間原(CommonClosure 原則,無環(huán)依賴原無環(huán)依賴原則指應(yīng)避免命名空間之間的循環(huán)依賴,如命名空間A依賴于命名空間B,命名空間B依賴于命名空間C,命名空間C又依賴于命名空間A。當(dāng)循環(huán)依賴產(chǎn)生時(shí),會(huì)對(duì)修設(shè)計(jì)模式的招式,它也是一種經(jīng)驗(yàn)性的總結(jié)。比如在太極拳中有一式叫“鐵牛耕地是這樣用的:A在B的過程中,如果A有機(jī)會(huì)閃到B的后面,就可以從后面勾住對(duì)方的脖子,然后快速用力向后拖,目標(biāo)是要用B的后腦勺去“耕地(相當(dāng)啊這樣最終達(dá)到一1ABAB境。一般認(rèn)為,GoF(GangofFour,指G ,Helm,JohnsonVli es與Addison-Wesley四位大師級(jí)的人物)于1995年的《設(shè)計(jì)模式——可復(fù)用面向?qū)ο筌浖幕?3種可性。API。實(shí)際上每一種設(shè)計(jì)模式都沒有固定的實(shí)現(xiàn)方法,每一種模式都有自身的適用范圍,學(xué)習(xí)設(shè)計(jì)模式時(shí),不求死記硬背,理解模式背景以及所解決的問會(huì)遇到些,比如學(xué)習(xí)工廠模式時(shí)實(shí)現(xiàn)代碼簡(jiǎn)單但設(shè)計(jì)思想復(fù)雜,學(xué)習(xí)模式時(shí)設(shè)計(jì)再談簡(jiǎn)單工廠模式(Simple圖2樓房的過如圖3所示,在一個(gè)類F中,如果既有可能會(huì)調(diào)用到A類的對(duì)象,也有可能調(diào)用到B類用,即在運(yùn)行時(shí)使用A與B的對(duì)象具有同等的機(jī)會(huì),而在設(shè)計(jì)時(shí)是無法確定的,這時(shí),在F3(或接口)1:publicclassTest{publicvoid{Config.OperType="*";IOperoper=doubled=oper.Cal(25,36); }}publicstaticclassConfig{publicstaticstringOperType=}publicclass{publicstaticIOper{stringtypeConfig.OperType;switch(type){casereturnnewAddOper();case"-":returnnewSubOper();case"*":returnnewMulOper();case"/":returnnewDivOper();thrownewException("}}}publicinterfaceIOper{doubleCal(doublei,double}publicclass{publicdoubleCal(doublei,double{returni+}}publicclassSubOper:{publicdoubleCal(doublei,double{returni-}}publicclassMulOper:{publicdoubleCal(doublei,double{returni*}}publicclassDivOper:{publicdoubleCal(doublei,double{if(j==thrownewException("0不能做除數(shù)!");returni/j;}}在上述代碼實(shí)現(xiàn)了一個(gè)類似于計(jì)算器的功能,AddOper用于實(shí)現(xiàn)加運(yùn)算,SubOper用于實(shí)現(xiàn)減運(yùn)算,MulOper用于實(shí)現(xiàn)乘運(yùn)算,DivOper用于實(shí)現(xiàn)除運(yùn)算,Test類用于模擬調(diào)用這算或減運(yùn)算,這里就出現(xiàn)了一個(gè)問題,如果在Test類的CalTest方法中,調(diào)用了AddOper類TestAddOperSubOper類綁定過死,即耦合度過高。Factory為工廠類,由于通過它可以得到具體的產(chǎn)品,所以也可以稱為實(shí)后在CalTest方法中,調(diào)用IOperCal方法實(shí)現(xiàn)計(jì)算。當(dāng)然在計(jì)算之間要為IOper做具體的IOper的對(duì)象指向AddOperCal將實(shí)現(xiàn)加運(yùn)算,SubOperCal將實(shí)現(xiàn)減運(yùn)算等等,這是一種典型的多態(tài)的應(yīng)用。至于要實(shí)現(xiàn)何種運(yùn)算完全可以由用戶在界面上的操作來決定然后這種操作于配置文件或一個(gè)全局性的靜態(tài)變量中,然后在工廠類Factory中,這一配置,根據(jù)不部調(diào)用。再如當(dāng)需要擴(kuò)展新的計(jì)算時(shí),只要增加新的計(jì)算類,并實(shí)現(xiàn)IOper接口,然后在.TestIOperFactory.GetOper方法通過反射機(jī)制得到具體的類型等,這樣可以使Factory類中的代碼具有更強(qiáng)的可伸縮性,類似的應(yīng)用在下一小廠、父類(或接口)及具體類(或?qū)崿F(xiàn)類)141工廠方法模式(Factory廠類中得到的,就像圖2所示的開發(fā)商一樣,如果一開始,該開發(fā)商只做居民房銷售,比如除了居民品外還在做寫字樓、商鋪等等的開發(fā),那么一個(gè)銷售部門肯定是不夠的,5所示。525所示中,居民房銷售分部、寫字樓銷售分部以及商鋪銷售分部統(tǒng)歸銷售總部管簡(jiǎn)單工廠內(nèi)的代碼也會(huì)變得越來越復(fù)雜而難以同時(shí)將屬于不同模塊的產(chǎn)品類組合在一2:publicclass{publicvoid{Factoryfactory=newIOperoper=factory.GetOper();doublem=oper.Cal(25,36); }}publicinterfaceIOper{doubleCal(doublei,double} class{ IOper}publicclassAddFactory:{publicoverrideIOper{returnnew}}publicclassSubFactory:{publicoverrideIOper{returnnew}}publicclassAddOper:{publicdoubleCal(doublei,double{returni+}}publicclassSubOper:{publicdoubleCal(doublei,double{returni-}}代碼中有兩個(gè)工廠類,AddFactorySubFactory,它們分別用于得到AddOperSubOper對(duì)象,然后在客戶調(diào)用程序Test中,采用IFactory接口對(duì)象接收了一個(gè)AddFactory對(duì)象,并IOperAddOper對(duì)象,并最終實(shí)現(xiàn)加運(yùn)算。這里,我們IOper我們稱為抽象產(chǎn)品AddOperSubOper稱為具體類,也即實(shí)體產(chǎn)品而將AddFactory和SubFactory稱為實(shí)體工廠這些實(shí)體工廠有一個(gè)統(tǒng)一的父類Factory,F(xiàn)actory中為這些實(shí)體工廠制作操作的規(guī)則。(類。也就是說,工廠方法模式將簡(jiǎn)單工廠中可能存在的代碼如增加新的計(jì)算類要修改客戶調(diào)用程序與具體類的耦合度,以增強(qiáng)程序的可擴(kuò)展性、可性等。(3:22usingusingSystem.Reflection;namespaceFactoryMethod{publicclass{staticvoid{Factoryfactory=(Factory)Assembly.Load("FactoryMethod").CreateInstance(Config.FactoryType);IOperoper=factory.GetOper();doublem=oper.Cal(25,36);}}publicstaticclassConfig{publicstaticstringFactoryType="}}26QQ老師,在工廠Factory到了什么抽象工廠模式 體工廠提供規(guī)則定義。就像圖4所示的開發(fā)商的案例中,銷售總部負(fù)責(zé)為各銷售分部定以在這里預(yù)定只是批發(fā)商和生產(chǎn)商的一種事先約定。而香腸由于產(chǎn)業(yè)規(guī)模做的很大,7套為Access,一套為SQLServer,并且在程序中應(yīng)該能夠隨時(shí)按照用戶要求,通過界面上的AccessSQLServer數(shù)據(jù)庫中的操作方式,4:AccessSQLServer兩套數(shù)788中,StuInfoManager為解決方案名稱,BLL為業(yè)務(wù)規(guī)則層項(xiàng)目,用于管理各個(gè)模塊夾下,為各個(gè)模塊Access數(shù)據(jù)庫的數(shù)據(jù)類,SQLServer文件夾下為各個(gè)模塊SQLServer數(shù)據(jù)庫的數(shù)據(jù)類;DBFactory為工廠類所在的項(xiàng)目,管理各抽象工廠類和各個(gè)Config中,實(shí)際應(yīng)用中可改用配置文件或其它方式。4publicclassInfoManager{publicintDeleteInfoData(string{Factory對(duì)象得到IInfoIInfoFactoryfactory=new IInfoinfo=factory.GetInfoService();returninfo.DeleteInfoData(stuID);}}publicinterfaceIInfo{intDeleteInfoData(string}/*****************模塊數(shù)據(jù)類//學(xué)員基本信息模塊的Access數(shù)據(jù)庫的數(shù)據(jù)publicclass{publicintDeleteInfoData(string{…}}//學(xué)員基本信息模塊的SQLServer數(shù)據(jù)庫的數(shù)據(jù)publicclass{publicintDeleteInfoData(string{…}} classFactory{ IInfoGetInfoService();}//得到Access數(shù)據(jù)庫的數(shù)據(jù)類(實(shí)體產(chǎn)品)的工廠類(實(shí)體工廠publicclassAccessFactory:{publicoverrideIInfo{returnnew}}//得到SQLServer數(shù)據(jù)庫的數(shù)據(jù)類(實(shí)體產(chǎn)品)的工廠類(實(shí)體工廠publicclassSQLServerFactory:{publicoverrideIInfo{returnnew}}我們先來復(fù)下我們前面講過的一些OOP原則PrinciplePrinciple編程。對(duì)于不同層次的編程,次給低層次的應(yīng)當(dāng)只是接口,而不是它的具體類。DemeterFactory類是一個(gè)工廠類,我們稱為抽象工廠類,因?yàn)樗划a(chǎn)生實(shí)際的產(chǎn)品,只是用于獲得或指向?qū)嶓w工廠當(dāng)增加新的產(chǎn)品族產(chǎn)品時(shí)如再增加一套Oracle數(shù)據(jù)庫的數(shù)據(jù)OracleFactory就可以了,所以此處符合開閉原則。但是我們?cè)僭黾右粋€(gè)新的產(chǎn)品時(shí),如增加一關(guān)于學(xué)員成績(jī)模塊的相關(guān)內(nèi)容,則可能需要操作IScores接口,用以定publicIScoresGetScoresService();在上述實(shí)現(xiàn)代碼中,AccessFactory和SQLFactory分別為得到Access數(shù)據(jù)庫的數(shù)據(jù)類(實(shí)體產(chǎn)品)和SQLServer數(shù)據(jù)庫的數(shù)據(jù)類(實(shí)體產(chǎn)品)的實(shí)體工廠,由于得DAL.Access.InfoService和DAL.SQLServer.InfoService屬性同一模塊兩套數(shù)據(jù)庫的兩套944Factory5:44publicclassInfoManager{publicintDeleteInfoData(string{Factoryfactory=Factory.CreateFactory();IInfoinfo=factory.GetInfoService();returninfo.DeleteInfoData(stuID);}}publicinterfaceIInfo{intDeleteInfoData(string}/*****************模塊數(shù)據(jù)類//學(xué)員基本信息模塊的Access數(shù)據(jù)庫的數(shù)據(jù)publicclass{publicintDeleteInfoData(string{…}}//學(xué)員基本信息模塊的SQLServer數(shù)據(jù)庫的數(shù)據(jù)publicclass{publicintDeleteInfoData(string{…}}publicstaticclass{//操作類型。DBFactory.AccessFactory:Access;當(dāng)前庫為publicstaticstringFactoryType="DBFactory.SQLServerFactory} classFactory{publicstaticFactory{stringfactoryType=Config.FactoryType;Factoryfactory=returnfactory; IInfo}//得到Access數(shù)據(jù)庫的數(shù)據(jù)類(實(shí)體產(chǎn)品)的工廠類(實(shí)體工廠publicclassAccessFactory:{publicoverrideIInfo{returnnew}}//得到SQLServer數(shù)據(jù)庫的數(shù)據(jù)類(實(shí)體產(chǎn)品)的工廠類(實(shí)體工廠publicclassSQLServerFactory:{publicoverrideIInfo{returnnew}}單例模式有一個(gè),可以使用單例模式描述,避免的發(fā)生。代碼演示:?jiǎn)卫J剑I漢式publicclass{privateTest(){privatestaticTesttest=newTest();publicstaticTestGetInstance(){return}}代碼演示:?jiǎn)卫J剑☉袧h式publicclass{privateTest(){privatestaticTesttest=null;publicstaticTest{lock(typeof(Test)){if(test=={test=newTest();returntest;}return}}},,QQ老師,為什么懶漢式中的GetInstance方法中要加上lock(typeof(Test句A懶漢式的GetInstance方法要首先判斷唯一實(shí)例是否存在,不存在則創(chuàng)建。在判程鎖定機(jī)制也會(huì)降低并 的效率設(shè)計(jì)模式模板模式 如連鎖品牌“街客”以提供現(xiàn)做的飲料而聞名,大部分“街客”的加盟店都是街1“街客”的就在于可復(fù)用的流程和節(jié)點(diǎn),雖然提供數(shù)十種不同的飲品,但制作流21:usingnamespaceTem{class{staticvoidMain(string[]{Console.Wriine("草莓刨冰:");drinknew草莓刨冰();Console.Wriine("鳳梨刨冰:");drink=new鳳梨刨冰();}} class{protectedvoid碎冰{ ine("30克冰塊。}protectedvoid加水{ } void加果汁 void裝杯publicvoid制作(){碎冰加水加果汁裝杯}}class草莓刨冰:{protectedoverridevoid加果汁{ }protectedoverridevoid裝杯{ }}class鳳梨刨冰:{protectedoverridevoid加果汁{ }protectedoverridevoid裝杯{ }}}刨冰飲料drink=new草莓刨冰(); drink=new鳳梨刨冰(); QQ老師,為什么在抽象類“刨冰飲料”中protected修飾流程節(jié)點(diǎn)的方法都A使用protected修飾的方法只能被本包和子 ,因?yàn)榱鞒坦?jié)點(diǎn)不需要對(duì)外Q老師,在“制作”方法中,調(diào)用了“加果汁”和“裝杯”這兩個(gè)抽象方法,抽A銀行計(jì)算利息案3門面模式因?yàn)閻勐犚魳?,買了一套7.1的音響系統(tǒng),由左右前置音箱、左右后置音箱、左右環(huán)繞音箱和低音組成,使用時(shí)發(fā)現(xiàn)要調(diào)整音量非常麻煩,需要分別調(diào)整7個(gè)音箱的音量,47為了方便調(diào)整音量,又買了一個(gè)中控臺(tái),現(xiàn)在只需要對(duì)中控臺(tái)發(fā)出音量調(diào)整的指7個(gè)音箱,如下圖所示:圖5只需要調(diào)整中控在此例中,中控臺(tái)就是門面模式的實(shí)際應(yīng)用,使用中控臺(tái),不需要再與7個(gè)音箱臺(tái))為用戶提供了粗粒度的操作,封裝了細(xì)粒度的操作。門面模式符合迪法則,用戶QQ usingSystem;namespaceFacadeDemo{class{staticvoidMain(string[]{ControlFacadecontrolFacade=newControlFacade(); }}

publicclass{SoundBox1box1=newSoundBox1();SoundBox2box2=newSoundBox2();SoundBox3box3=newSoundBox3();SoundBox4box4=newSoundBox4();SoundBox5box5=newSoundBox5();SoundBox6box6=newSoundBox6();SoundBox7box7=newpublicvoid{}publicvoid{}}publicclass{publicvoid{ }publicvoid{ }}publicclass{publicvoid{ }publicvoid{ }}publicclass{publicvoid{ }publicvoid{ }}publicclass{publicvoid{ }publicvoid{ }}publicclass{publicvoid{ }publicvoid{ }}publicclass{publicvoid{ }publicvoid{ }}publicclass{publicvoid{ }publicvoid{ }}}策略模式OOP設(shè)計(jì)原則下,使用者可以靈活的選擇具體的策2:usingnamespace{class{staticvoidMain(string[]{doubleoldPrice=DiscountContextcontextnew if(DateTime.Now.Month==5&&DateTime.Now.Day=={context.SetDiscountType(new}elseif(DateTime.Now.Month==10&&DateTime.Now.Day=={context.SetDiscountType(new}doublerealPrice=context.Discount(oldPrice); ine(":"+oldPrice.ToString()); ine("折扣價(jià):realPrice.ToString());}}publicclassDiscountContext{privateDiscountpublicDiscountContext(Discount{this.discount=}publicvoidSetDiscountType(Discount{this.discount=}publicdoubleDiscount(double{return}}//抽象策略(通過抽象策略具體策略 class{ doubleDisc(double}public mon:{publicoverridedoubleDisc(double{returnd*}}publicclassDiscount_51:{publicoverridedoubleDisc(double{returnd*}}//10.1節(jié)的折扣策略(具體策略publicclassDiscount_101:{publicoverridedoubleDisc(double{returnd*}}}上述代碼實(shí)現(xiàn)了平常日期、5.1勞動(dòng)節(jié)及10.1節(jié)三個(gè)具體的折扣策略(分別Discount_101(Discount了一個(gè)使用上下文DiscountContext,該類封裝了通過抽象策略實(shí)現(xiàn)折扣計(jì)算。在調(diào)用程序桂枝為臣藥輔助發(fā)汗,杏仁為佐藥平喘,為使藥調(diào)、臣、使三者的藥性;如果認(rèn)為汗,、生姜、大棗為使藥調(diào)和各藥的藥性。下面是兩個(gè)情景的示意類圖:34設(shè)計(jì)模式1.模式的類模式就是通過增加對(duì)象將對(duì)象間的直接形式改為間接形式所謂對(duì)象間的直接,指對(duì)象A持有對(duì)象B的實(shí)例,然后通過該實(shí)例調(diào)用對(duì)象B中的方法;而對(duì)象間的間接,指對(duì)象A持有對(duì)象C的實(shí)例,當(dāng)對(duì)象A調(diào)用對(duì)象C的方法時(shí)對(duì)象C委托對(duì)象B中的方法進(jìn)行功能實(shí)現(xiàn),一般來說,對(duì)象C應(yīng)與對(duì)象B“兼容(實(shí)現(xiàn)同一接口或集成同一父類,使對(duì)象A(實(shí)例持有者)體會(huì)不到對(duì)象B與對(duì)象C的區(qū)別,如圖1對(duì)象直接與間接的區(qū)圖2對(duì)象C也可以多個(gè)目標(biāo)對(duì)將對(duì)象的形式由直接變?yōu)殚g接后,對(duì)象C(稱為對(duì)象,)能夠B(稱為目標(biāo)對(duì)象,Target)B提供保護(hù),或提供額外的操作對(duì)象的功能不同,可以將模式劃分為以下幾個(gè)種類保Web開發(fā)中,一般可將安全防護(hù)分為三個(gè)級(jí)別,即頁面級(jí)安全、方法級(jí)安全和數(shù)據(jù)級(jí)安全。頁面級(jí)安全我們都很熟悉,往往通過Session獲取用戶名后檢查其是否具有該至于數(shù)據(jù)級(jí)安全則取決于業(yè)務(wù)需求,比如銷售系統(tǒng)中,銷售員只能查看個(gè)人的,不能查看其他銷售員的就是一種數(shù)據(jù)級(jí)的安全需求。智虛、的加載或應(yīng)用程序加載數(shù)據(jù)時(shí),當(dāng)操作比較消耗資源時(shí)通過虛擬實(shí)現(xiàn)提示用、。(Ambassador,而不是的,而對(duì)象承擔(dān)了大部分的網(wǎng)絡(luò)通信工作Cache為某一個(gè)目標(biāo)操作的結(jié)果提供臨時(shí)的空間,以便多個(gè)客戶端可以共享這些結(jié)果保護(hù)目標(biāo),不讓用戶接近同步使幾個(gè)用戶能夠同時(shí)使用一個(gè)對(duì)象而沒有在所有種類的模式中,虛擬(Virtual)、(Remote)、智能代理(SmartReference)和保護(hù)(ProtectorAccess)是最為常見的模式。判斷下面的情景是否使用了模式,是哪種類型的模式圖 2.模式的實(shí)在模式的實(shí)現(xiàn)中,最的部分就是創(chuàng)建對(duì)象。一般要求對(duì)象和目標(biāo)對(duì)象的使用

溫馨提示

  • 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. 人人文庫網(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)論