




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Java編碼規(guī)范及實踐目錄Java編碼規(guī)范及實踐 11.2 術語 31.3 約束 4||!(condition5&&condition6)){ 154.1 一般命名規(guī)范 15IQuery,IDataAccess,IReportBuilder 16MAX_TIMES,DEFAULT_NAME 164.2 特殊命名規(guī)范 18AbstractReportBuilder,AbstractBeanFactory 19AccessException,RuntimeException 205.2 一般原則 211. 代碼應該和注釋保持同步,如果代碼和注釋不同步,則閱讀代碼的人會 212. 注釋盡量簡潔,尺度沒有準確的定義,大部分人能明白即可,可以將自 21ResultgetResult()throwsException{ 22ObjectgetAction(); 23JavaDoc工具不要改變格式. 23Getadefaultdate/timeformatterthatusestheSHORT 24Thread.sleep(1000); 25Derived,如果一個方法可以接受基類對象b的話:method1(Baseb), 267.1 工廠模式 277.1.1簡單工廠 277.1.2工廠方法 277.2 單例模式 28Client: 287.3 適配器模式 297.4 組合模式 30Client: 307.5 外觀模式 31Client: 317.6 代理模式 327.7 命令模式 33Client: 347.8 觀察者模式 347.9 策略模式 36Client: 36IKeyPairGenerabledesGenerator= 36IKeyPairGenerablersaGenerator= 37IKeyPairGenerableideaGenerator= 37KeyPairManagermanager=newKeyPairManager(); 377.10模版方法模式 377.11參觀者模式 39總價格 41Client: 41第1章概述1.1 前言代碼之于程序員,就像零件之于機械工,莊稼之于農民,它是軟件的基石,一行行代碼都是程序員的心血經過日日夜夜凝結成的。做為一個程序員,應該像母親呵護孩子一樣呵護自己的代碼,它不僅僅是一行一行的文字,它是一個程序員的尊嚴和價值所在;它是活的,你甚至能感受到它的心跳。編碼規(guī)范只是大家達成一致的約定,這樣大家的代碼就可以互相看懂,維護起來更加容易,思想更暢快的交流,經驗更快的得到傳播。代碼規(guī)范不是束縛程序員的桎梏,應該知道,不遵守規(guī)范的個性的代碼并不代表程序員的性格,并不能張揚個性。個性應該體現在用更簡單、更優(yōu)雅、更易讀、更易理解以及算法實現效率更高等方面。可讀性,可理解性是代碼的重要方面,本規(guī)范主要圍繞如何去產生規(guī)范易讀的代碼。另外,它也保證了大家有共同的先驗知識。1.2 術語 Pascalcase- 所有單詞第一個字母大寫,其它字母小寫。例:Person,OrderDetail,OilTank。 Camelcase - 除了第一個單詞,所有單詞第一個字母大寫,其他字母小寫。例:oilLevel,customerName在后面的描述中我們使用Pascal代表第一種表示方式,Camel代表第二種表示方式。1.3 約束沒有一個規(guī)范可以到處適用,也不可能無所不包。1.2.
本規(guī)范并非完全強制性規(guī)范,對于任何違背本規(guī)范但能提高代碼可讀性的措施,都可以采用。本規(guī)范第3,4,5章為強制性規(guī)范,其它章節(jié)為建議規(guī)范。如違背本條,請參考第一條。第2章一般規(guī)則1) 所有包,類,接口,方法,屬性,變量,參數均使用英文單詞進行命名,具體細節(jié)請參見命名規(guī)范一章。2) 命名包,類,接口,方法以及變量時,盡量使用貼近問題域的表意豐富的名稱。3) 修改源代碼時,應盡量保持與所修改系統(tǒng)的編碼風格保持一致。4) 所有包名使用必須使用com.[company]前綴,所有項目使用 com.[company].[projectname],company是公司簡稱,projectname是項目的縮寫。第3章格式規(guī)范5) 包的導入應該按照相關性進行分組。importjava.io.IOException;import.URL;importjava.rmi.RmiServer;importjava.rmi.server.Server;importjavax.swing.JPanel;importjavax.swing.event.ActionEvent;importorg.linux.apache.server.SoapServer;6) 只倒入明確需要的類,這樣只要看導入列表,就可以知道該類依賴于哪些類和接口,保證可讀性。importjava.util.List; // 避免:importjava.util.*importjava.util.Arraylist;importjava.util.HashSet;7) 類和接口中元素的布局順序。1.類和接口的文檔描述2.類和接口的聲明3.類的靜態(tài)變量,按照public,protected,private的順序。4.實例變量,按照public,protected,private的順序。5.類的方法,無固定順序。8) 類的聲明,基類和實現的接口應該獨立成行,保證可讀性。classUserManagerImplextendsAbstractManagerimplementsIUserManager{…}9) 方法修飾關鍵字定義順序。<public,protected,private>staticabstractsynchronizedunuaualfinalnativemethodName注意訪問標示符一定要在最前面。public static doublesquare(doublea);//避免:staticpublicdoublesquare(doublea);10) 變量聲明,采用Camel表示法不要在一行聲明多個變量。//推薦int level;int size;//避免intlevel,size;11) 保證明確的類型轉換,不要默認進行隱式類型轉換intValue=(int)floadValue;//避免intValue=floatValue12) 數組指示符緊跟類型變量int[]a=newint[20]; // 避免:inta[]=newint[20]一個變量要代表獨立的意思,不要在其生命周期賦予它不同的概念。inttempValue;tempValue=maxValue;……tempValue=minValue;…tempValue=anotherValue;tempValue在生命周期內表示了各種各樣的意圖,增加理解代碼的難度。應該為每個獨立概念定義單獨的變量:int tempMaxValue;int tempMinValue;int tempAnotherValue;13) 僅僅循環(huán)控制變量才能出現在for()循環(huán)中sum=0;for (i=0;i<100;i++){sum+=value[i];}//避免:for(i=0,sum=0;i<100;i++){sum+=value[i];}14) 循環(huán)變量應靠近循環(huán)體初始化isDone=falsewhile(!isDone){…}//避免isDone=false;……while(!isDone){…}15) 避免長的布爾表達式,應換成多個更容易理解的表達式。boolisFinished=(elementNo<0)||(elementNo>maxElement);boolisRepeatedEntry=elementNo==lastElement;if(isFinished||isRepeatedEntry){…}// 避免if((elementNo<0)||(elementNo>maxElement)||elementNo==lastElement){…}16) 不要在條件語句中執(zhí)行方法,以提高可讀性InputStreamstream=File.open(fileName,"w");if(stream!=null){…}//避免if(File.open(fileName,"w")!=null)){…}17) 代碼縮進,應該使用4個空格為一個單位進行縮進。publicStringinvoke()throwsException{StringprofileKey="invoke:";try{UtilTimerStack.push(profileKey);if(executed){test=true;}}
catch{}18) 條件語句的主要形式,即使單條語句,也要使用括號括起來。if(condition){statements;}if(condition){statements;} else{statements;}if(condition){statements;} else if(condition){statements;} else{statements;}19) 空循環(huán)體也要使用完整的{}塊for(initialization;condition;update){;}20) switch語句的使用格式switch(condition){caseABC:statements;//穿透,一定要做出注釋caseDEF:statements;break;caseXYZ:statements;break;default:statements;break;}21) try-catch使用格式try{statements;}catch(Exceptionexception){statements;}try{statements;}catch(Exceptionexception){statements;}finally{statements;}22) 空格的使用1. 運算符兩邊應該各有一個空格。2. Java保留字后面應跟隨一個空格。3. 逗號后面應跟隨一個空格。4. 冒號兩個應各有一個空格。5. 分號后面應跟隨一個空格。a=(b+c)*d;while(true){
//NOT:a=(b+c)*d//NOT:while(true){...doSomething(a,b,c,d);//NOT:doSomething(a,b,c,d);case100:
//NOT:case100:for(i=0;i<10;i++){ //NOT:for(i=0;i<10;i++){...23) 空行的使用1. 文件頭部注釋、package語句和import語句之間。2. class之間3. 方法之間4. 方法中,變量的申明和具體代碼之間。5. 邏輯上相關的語句段之間6. 塊注釋和行注釋的前面▽ 代表空行/****/▽packageXXX.XXX;▽importXXX.XXX.XXX.XXX;▽/****/public classUserFileAccess{▽//private int myObjId;▽/****/publicUserFileAccess(){???}▽/****/public voidgetCtlInfo(){int
count;▽▽
String msg;count=100;???//實現代碼注釋前空行msg=“MESSAGE”;▽count=dataCount;if(count==0){???}}▽/****/private classUserFileRead{24) 邏輯上緊密相關的代碼塊應該用一個空行分開。//CreateanewidentitymatrixMatrix4x4 matrix= newMatrix4x4();//Precomputeanglesforefficiencydouble cosAngle=Math.cos(angle);double sinAngle=Math.sin(angle);// Specify matrix as a rotation transformationmatrix.setElement(1,1,cosAngle);matrix.setElement(1,2,sinAngle);matrix.setElement(2,1,-sinAngle);matrix.setElement(2,2,cosAngle);//Applyrotationtransformation.multiply(matrix);25) 為了保證可讀性,變量名應該左對齊。TextFilefile;int nPoints;doublex,y;//避免TextFilefile;intnPoints;doublex,y;26) 像前面一般規(guī)則里說的那樣,任何提高代碼可讀性的排版都可以去嘗試,下面是一些例子。if
(a==lowValue)compueSomething();else if(a==mediumValue)computeSomethingElse();else if(a==highValue)computeSomethingElseYet();value=(potential*oilDensity)/constant1+(depth *waterDensity)/constant2+(zCoordinateValue*gasDensity)/constant3;minPosition=
computeDistance(min,x,y,z);averagePosition=computeDistance(average,x,y,z);switch(phase){casePHASE_OIL:text="Oil"; break;casePHASE_WATER:text="Water";break;casePHASE_GAS:text="Gas"; break;}27) 當對 if 語句中的條件進行折行時,應該使折行的條件語句相對主功能語句再行縮進4個空格,以突出主要功能語句。//使用這種縮進,突出主要功能語句。if((condition1&&condition2)||(condition3&&condition4)||!(condition5&&condition6)){doSomethingAboutIt();}//避免使用這種縮進,主功能語句不突出。if((condition1&&condition2)||(condition3&&condition4)||!(condition5&&condition6)){doSomethingAboutIt();}28) 三元條件運算符可以使用如下三種表達方式,條件要用括號括起來。alpha=(aLongBooleanExpression)?beta:gamma;alpha=(aLongBooleanExpression)?beta:gamma;alpha= (aLongBooleanExpression)?beta:gamma第4章命名規(guī)范4.1 一般命名規(guī)范29) 包名應該用小寫字母,不要出現下劃線等符號,名詞用有意義的縮寫或者英文單詞。示例://推薦com.esse.businessjava.lang.util//避免com.Esse-tech.buSiness30) 所有類命名使用Pascal表示方式,使用名詞組合。UserManager,ClassLoader, HttpHeaderResult31) 接口命名使用字母“I”加上Pascal形式的表示方式。IQuery,IDataAccess,IReportBuilder32) 使用名詞組合或形容詞去命名一個接口,接口聲明了一個對象能提供的服務,也描述了一個對象的能力。一般以“able”和“ible”作為后綴,代表了一種能力。public interfaceRunnable{public voidrun();}public interfaceAccessible{publicContextgetContext();}33) 變量名和參數名使用Camel表示方式。userName,objectFactory,entrys,list34) 對于常量名,使用大寫字母,并使用下劃線做間隔。MAX_TIMES,DEFAULT_NAME程序中應該使用常量代替“25”,“100”等實際的數字,如://推薦if(times==MAX_TIMES){…}//避免if(times==25){…}這樣做的好處是,當因需要修改實際的數字時,比如修改25為30,只需要修改一處。35) 方法名應該使用動詞開頭,使用 Camel 表示方式,一般由動詞+名詞組成。getName,initialize,addParameter,deleteUser36) 縮寫字母也應該保持首字母大寫exportHtmlSource();// 避免:exportHTMLSource();openDvdPlayer(); // 避免:openDVDPlayer();37) 變量的名字應該和類型名稱一致voidsetTopic(Topictopic) // 避免:voidsetTopic(Topicvalue)// 避免:voidsetTopic(TopicaTopic)// 避免:voidsetTopic(Topict)voidconnect(Databasedatabase)// 避免:voidconnect(Databasedb)// 避免:voidconnect(DatabaseoracleDB)當同時定義多個屬于同一個類的變量時,把類型作為實例的后綴,如:PointstartPoint;PointcenterPoint;這樣做是為了從實例名就可以推斷它的類型名稱。38) 根據變量的作用范圍,作用范圍大的應該使用長名稱,作用范圍大,表明變量的生命周期比較長,為了有助于理解,應盡量用長名稱以表達變量的真實意圖。反之,對于作用范圍小,可以使用一些簡化的名稱,比如i,j,k等,提高編程效率。for(int i=0;i<times;i++){…}4.2 特殊命名規(guī)范39) 使用get/set對類屬性進行訪問,這是Java社區(qū)的核心編碼規(guī)范。40) 使用is前綴表示一個布爾變量和方法。isUsed,isEmpty,isVisible,isFinished有時也可以使用has,can,should:booleanhasLicense();booleancanEvaluate();booleanshouldAbort=false;41) 在查詢方法中應使用find作為前綴vertex.findNearestVertex();matrix.findSmallestElement();node.findShortestPath(NodedestinationNode);42) 使用initialize做為對象初始化的方法前綴,也可以簡寫為initinitializeFiles();init();initFontSet();43) 對于對象集合, 變量名稱應使用復數。Collection<Point>points;int[]
values;44) 對于抽象類,應該使用Abstract前綴。AbstractReportBuilder,AbstractBeanFactory45) 對于表示編號的變量,應加No后綴。tableNo,userNo,employeeNo46) 常在一起使用的對稱詞匯,這些詞匯一起使用,方法的表達意圖自然可以互相推測和演繹。get/set,
add/remove,
create/destroy,
start/stop,insert/delete,increment/decrement,begin/end,first/last,up/down,min/max,next/previous,old/new,open/close,show/hide,suspend/resume47) 避免使用否定布爾變量boolisError; // 避免:isNoErrorboolisFound;// 避免:isNotFound48) 異常類應該使用Exception做為后綴。AccessException,RuntimeException49) 缺省接口實現應該使用Default前綴classDefaultTableCellRendererimplementsTableCellRenderer{…}50) 對于單例類(Singleton),應該使用getInstance方法得到單例。classUnitManager{privatefinalstaticUnitManagerinstance=newUnitManager();privateUnitManager(){...}public staticUnitManager getInstance(){returninstance_;}}51) 對于工廠類,進行創(chuàng)建對象的方法,應該使用new前綴classPointFactory{publicPoint newPoint(...){...}}第5章注釋規(guī)范5.1 概述代碼中為什么要包含注釋?1. 別人要調用你的程序中的公共接口,對這部分進行文檔描述,使別人能夠正確而有效的使用它。2. 除了自己,別人要閱讀和維護你的代碼。為了使代碼更容易維護,首先要使代碼更易于理解,才能在理解的基礎上進行維護。對這些代碼進行文檔描述,將使這個過程變得更加容易。對代碼進行注釋,是在代碼可讀性的基礎上,使用自然語言對代碼所表達的意思進行闡述。并不是說代碼可以寫的很爛,注釋寫的很詳細,這不是好的方式。如果代碼可讀性很好,命名表意豐富,清晰,一般不需要特別多的注釋。對于類,主要著重要描述它的職責,即它能干什么,對于復雜的算法實現,應該使用內部實現注釋,說明算法的主要思路,對于長方法,要讓閱讀代碼的人比較容易的明白方法實現的主要流程。反之,對于一看就懂的方法,則不需要進行注釋,比如get/set方法。5.2 一般原則1. 代碼應該和注釋保持同步,如果代碼和注釋不同步,則閱讀代碼的人會想,“到底是代碼準確,還是注釋準確啊”,換誰都會糊涂。2. 注釋盡量簡潔,尺度沒有準確的定義,大部分人能明白即可,可以將自己的代碼給同事看看。太簡單的方法就不要注釋了,比如上面提到的get/set方法。5.3 注釋內容/**Copyright(c)2002-2006byOpenSymphony*Allrightsreserved.*/packagecom.opensymphony.xwork2;
1importerceptor.PreResultListener;importcom.opensymphony.xwork2.util.ValueStack;importjava.io.Serializable;/***類職責簡要描述*。。。*
2*@authorJasonCarreira*@seecom.opensymphony.xwork2.ActionProxy*/publicclassActionInvocationimplementsSerializable{/***方法簡要描述**方法詳細描述*。。。*
3*JavaDoctags,比如*@author*@version*@see 。。。
4*@returnaResultinstance*/ResultgetResult()throwsException{//內部實現注釋//多行內部實現注釋
5}/**
Stringname= this.getName();*GettheActionassociatedwiththisActionInvocation*/ObjectgetAction();/***@returnwhetherthisActionInvocationhasexecutedbefore.*executed.*/booleanisExecuted();/***InvokesthenextstepinprocessingthisActionInvocation.*one.IfInterceptorschoosenotto*theywillcallinvoke()toallowthenextInterceptortoexecute*theActionisexecuted.IftheActionProxygetExecuteResult*/Stringinvoke() throwsException;}①代碼的版權信息。②類描述信息,描述類的主要職責和用處。③方法描述信息,描述方法是做什么的,如何調用,最好給出調用代碼示例。④ JavaDoctags,用來生成Html形式的API文檔⑤ 內部實現注釋,用于描述復雜的算法,長方法,從為什么要這么做角度去描述52) 盡可能在類描述中加入代碼調用示例,使用<pre></pre>標記,提示JavaDoc工具不要改變格式./***DateFormatisanabstractclassfordate/timeformatting*formatsandparsesdatesortimeinalanguage-independentmanner.**<pre>*myString=DateFormat.getDateInstance().format(myDate);*</pre>*<pre>*DateFormatdf=DateFormat.getDateInstance();包含代碼調用示*for(inti=0;i<myDate.length;++i){*output.println(df.format(myDate[i])+";");*}*</pre>**@seeFormat*@seejava.util.TimeZone*@version1.5104/12/04
例*@authorMarkDavis,Chen-LiehHuang,AlanLiu*/public abstract classDateFormat extendsFormat{53) 使用@deprecated廢棄方法,不要刪掉它。/***...*@deprecated*//*Getadefaultdate/timeformatterthatusestheSHORTdateandthetime.publicfinalstaticDateFormatgetInstance(){returngetDateTimeInstance(SHORT,SHORT);}*/54) 使用行末注釋對深層嵌套代碼進行注釋for(i…){for(j…){while(…){if(…){switch(…){…}//endswitch}//endif}//endwhile}//endfori}//endforj第6章編程實踐55) 對于靜態(tài)方法,應該使用類名去使用,不應該用實例去引用,主要是為了體現更多的語義。Thread.sleep(1000);//避免,無法體現sleep是靜態(tài)方法還是實例方法thread.sleep(1000);56) 對一些基本數據類型和不太可能通過繼承進行擴展的類,應聲明為final,提高效率。57) 類和方法的粒度保持適中,保持類的規(guī)模盡量短小,職責單一。小類有很多好處,易于設計,易于測試,易于理解。同樣方法也要盡量的小,每個方法盡量不要超出25行。58) 開閉原則,軟件應該對擴展開發(fā),對修改開放。也就是說,應該在不修改以前源代碼的基礎上,改變程序的行為以適應新的需求。59) 里氏代換原則:假設有兩個類,一個是基類 Base,一個是派生類Derived,如果一個方法可以接受基類對象b的話:method1(Baseb),同樣,這個方法也應該接受派生類Derived的對象d,而不影響方法的行為。里氏代換原則是繼承復用的基石。60) 抽象依賴原則(穩(wěn)定依賴原則)。應該依賴于抽象而不依賴與具體類,抽象的類和接口是穩(wěn)定的,而具體類是易變的,如果依賴于具體類,代碼就會非常脆弱,失去了靈活性。61) 接口隔離原則,一個類對另外一個類的依賴應該建立在最小的接口之上的。62) 單一職責原則,如果一個類有多于一種的職責,當需求變化時,類的職責就要發(fā)生變化,而因此就會引起引用該類的代碼發(fā)生改變,職責越多,這個類就容易跟更多的類產生耦合關系,而且改變一個職責,可能會影響到另外一個職責的履行。63) 編寫代碼前,先編寫注釋(可以認為是偽代碼),先想后寫。/*** 報表構建器,主要職責:*1.創(chuàng)建拷貝報表模版*2.填充報表數據*3.構建報表*4.畫圖處理*/通過編寫這些偽代碼,可以起到理清思路的作用,這時候再編寫代碼,過程就非常流暢了,不會編一會兒,想一會兒,刪掉代碼,再重新編。第7章設計模式快速參考本章描述常見的設計模式。描述主要由兩部分組成,一部分是模式代碼,一部分時調用示例。7.1 工廠模式7.1.1簡單工廠abstract classFruit{}classApple extendsFruit{}classOrange extendsFruit{}classFruitFactory{pulic staticFruitgetFruit(StringfruitType){if(“apple”==fruitType){returnnewApple();} else if(“orange”==fruitType){returnnewOrange();}}}Client:Apple apple=FruitFactory.getFruit(“apple”);...7.1.2工廠方法interface IFruitFactory{puhlic FruitgetFruit();}classAppleFactory implementsIFruitFactory{publicFruitgetFruit(){//生產蘋果return newApple();}}Client:IFruitFactory factory= newAppleFactory();Fruitfruit= newfactory.getFruit();7.2 單例模式classSingleton{private staticSingleton singleton=null;public staticSingletongetInstance(){if(null==singleton){singleton=newSingleton();}returnsingleton;}public StringotherOperation(){//方法實現}}Client:String str=Singleton.getInstance().otherOperation();多線程時使用double-check模式確保線程安全:classSingleton{private staticSingleton singleton=null;public staticSingletongetInstance(){if(null==singleton)sychronized(Singleton.class){}
}
if(null== singleton){singleton=newSingleton();}}
}
return singleton;7.3 適配器模式interfacePowerable{110vprovide();}class110v{}class220v{}class110vPowerimplementsPowerable{public110vprovide(){//提供110v電壓}}class220vPower{public220vprovide(){//提供220v電壓}}class220vAdapterimplementsPowerable{public110vprovide(){110vvoltage=null;220vPowerpower=new220vPower();}
}
//轉換過程,@!@#$%^returnvoltage;Client:Powerable provider= new220vAdapter();vide();7.4 組合模式abstract classHardware{}classMainboard extendsHardware{}classMemory extendsHardware{}classDisplay extendsHardware(}classNetworkAdapter extendsHardware{}classComputer extendsHardware[privateList parts= newArraylist();publicListadd(Hardwarehardware){parts.add(hardware);returnparts;}}Client:Computercomputer= newComputer();Mainboardmainboard= newMainboard();NetworkAdapternetworkAdapter= newNetworkAdapter();Displaydisplay= newDisplay();Memorymemory= newMemory();computer.add(mainboad).add(networkAdapter).add(display).add(memory);7.5 外觀模式為一組類提供簡單的外部接口,使外部調用者不需要和所有內部干系人打交道,就能讓調用者滿意。classCallCenter{public voidsolve(Customercustomer){//接受客戶提出的問題operator.acceptProblem(customer.getProblem());booleancanSolved=operator.solve();if(!canSolved){//如果不能解決,則請求其它人幫助。operator.askHelp();}}}classCustomer{public voidcall(CallCentercallCenter){callCenter.solve(this);}}classOperator{}Client:CallCenter callCenter= newCallCenter();Custom aCustomer= newCustomer();aCustomer.call(callCenter);這里對客戶來講,與他接觸的只有一個接口,就是接線員,最后的結果是解決他的問題。接線員可以直接解決,如果他不能解決,它可以選擇請求其它人的幫助去解決這個問題??蛻羰遣魂P心接線員在內部做了什么。7.6 代理模式classFileDownloader(publicdownload(Filefile);}classFile{}//一般代理類使用Proxy后綴classFileDownloaderProxy{FileDownloaderProxy(FileDownloaderdownloader){this.downloader=downloader;}privateFileDownloaderdownloader;publicdownload(Filefile){//這里可以添加通知,通知用戶開始下載文件notifyDownloadWillStart();//調用代理目標類的方法,進行下載文件this.downloader.download(file);//這里可以添加通知,通知用戶文件下載完成notifyDownloadIsComplete();}privatevoidnotifyDownloadWillStart(){System.out.println(“下載開始…”);}privatevoidnotifyDownloadIsComplete(){System.out.println(“下載完成!”);}}Client:FileDownloaderProxy proxy=newFileDownloaderProxy( newFileDownloader());proxy.downlaod(file);代理模式提供了一種間接性,可以做一些附加工作,比如記錄日志,觸發(fā)一些事件等,Spring框架中大量使用了這個模式來進行AOP編程。7.7 命令模式interfaceICommand{voidexecute(IReceiverreceiver);}//發(fā)送傳真命令classSendFaxCommand implenmentsICommand{voidexecute(IReceiverreceiver){receiver.do(this);}}classAttackCommand implementsICommand{voidexecute(IReceiverreceiver){receiver.do(this);}}classGeneral{publicICommandcreateCommand(StringcommandType){if(“發(fā)傳真”==commandType){return newSendFaxCommand();}else if(“打仗”==commandType){return newAttackCommand();}}}interfaceIReceiver{voiddo(ICommandcommand);}classSecretary implementsIReceiver{//將具體命令信息傳入,如傳真文件內容等。public voiddo(ICommandcommand){//發(fā)送傳真}}classSoldier implementsIReceiver{//將具體命令傳入,如作戰(zhàn)地點,作戰(zhàn)目標等等。public voiddo(ICommandcommand){//打仗}}Client:General pengDeHuai= newGeneral();Secretary pengDeHuaiSecretary= newSecretary();Soldier zhangSan= newSoldier(“張三”);ICommand sendFaxCommand=pendDeHuai.creatCommand(“發(fā)傳真”);sendFaxCommand.execute(pengDehuaiSecretary);ICommand sendFaxCommand=pendDeHuai.creatCommand(“打仗”);sendFaxCommand.execute(zhangSan);7.8 觀察者模式//主題,這里是快餐店classSnackShop{}
privateList<Customer>customers=newArraylist();publicvoidadd(Customercustomer){customers.add(customer);}//通知,對訂閱主題的客戶發(fā)布通知,比如“外賣已好”publicvoidnotify(){for(Customerc:customers){c.getFood();}}//訂閱者,這里是客戶classCustomer{Customer(SnackShopshop){//將客戶加入到快餐店列表shop.add(this);}//回調函數,當接到通知后,客戶的動作publicvoidgetFood(){//取得外賣}}Client:SnackShop snackShop= newSnackShop();Customer zhangSan= newCustomer(snackShop);snackShop.notify();7.9 策略模式//密鑰對生成接口interfaceIKeyPairGenerable{KeyPaircreate();}classKeyPair{}classDesKeyPairGeneratorimplementsIKeyPairGenerable{}classIdeaKeyPairGenerator implementsIKeyPairGenerable{}classIdeaKeyPairGenerator implementsIKeyPairGenerable{}classKeyPairManager{privateIKeyPairGenerable generator;privateList keyPairList=newArraylist();publicvoid setGenerator(IKeyPairGenerablegenerator){this.generator=generator;}publicKeyPaircreate(){KeyPair keyPair=null;if(null!= generator){keyPair=generator.create();keyPairList.add(keyPair);}return keyPair;}}Client:IKeyPairGenerabledesGenerator=newDesKeyPairGenerator();IKeyPairGenerablersaGenerator=newRsaKeyPairGenerator();IKeyPairGenerableideaGenerator=newIdeaKeyPairGenerator();KeyPairManagermanager=newKeyPairManager();//使用DES算法生成密鑰manager.setGenerator(desGenerator);KeyPairkeyPair=manager.create();//使用RSA算法生成密鑰manager.setGenerator(rsaGenerator);KeyPairkeyPair=manager.create();可以看出,KeyPairManager僅僅依賴于接口IKeyPairGeneratble, 改變密鑰對生成算法不改變KeyPairManager類。策略模式一般用來封裝算法的不同實現。7.10模版方法模式abstractclassTravelTemplate{public voidtravel(){//上車getOnBus();//去目的地goto(“目的地”)//吃飯eat();//下車}
getOffBus();//如果想拍照,就拍照if(wantToTakePhoto){takePhoto();}//如果想上廁所,就上廁所if(wantToGotoRestroom){gotoRestRoom();}//上車回家getOnBus();goHome();}
protected voidgoto(Stringstr){}protected voidgetOnBus(){}protected voideat{}protected voidtakePhoto(){}protected voidgotoRestRoom(){}protected voidgetOffBus(){}protected voidgoHome(){}classHangzhouTravelTemplate extendsTravelTemplate{}classBeijingTravelTemplate extendsTravelTemplate{}classTourist{privateTravelTemplatetemplate;pulic voidsetTravelTemplate(TravelTemplatetemplate){}publictravel(){();}}TravelTemplate hangzhouTemplate=newHangzhouTravelTemplate(“杭州一日游”)TravelTemplate beijingTemplate=newHangzhouTravelTemplate(“北京奧運兩日游”)Tourist zhangSan= newTourist(“張三”);//杭州一日游zhangSan.setTemplate(travelTemplate);zhangS();
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度水上樂園游泳館場地租賃與水上樂園配套設施租賃協(xié)議
- 2025年度老舊小區(qū)外墻改造工程安全責任合同
- 二零二五年度國際貿易信用證業(yè)務代理及風險管理協(xié)議
- 海洋漁業(yè)資源保護與海產品銷售一體化合同
- 二零二五年度企業(yè)用工協(xié)議與勞動權益保障與員工激勵機制合同
- 二零二五年度廠房裝修施工安全責任與綠色施工標準協(xié)議書
- 2025年度酒店與旅游紀念品店合作經營合同
- 二零二五年度籃球活動參與者免責責任協(xié)議
- 二零二五年度汽車美容店員工勞動爭議解決合同模板
- 二零二五年度農村房屋贈與合同附農業(yè)保險合作協(xié)議
- 《人工智能基礎》課件-AI的前世今生:她從哪里來
- 2024年沙洲職業(yè)工學院高職單招(英語/數學/語文)筆試歷年參考題庫含答案解析
- 家譜樹形圖模板
- 工程交付培訓記錄表
- 髖膝關節(jié)置換術后X線評價-PPT課件
- 蓋梁抱箍法施工計算書蓋梁抱箍法施工方案
- JIS G4305-2021 冷軋不銹鋼板材、薄板材和帶材
- (完整版)涼亭施工方案
- 第一章 - 免疫規(guī)劃信息管理系統(tǒng)
- 生物安全手冊(共39頁)
- 破產管理人報酬計算器
評論
0/150
提交評論