java與模式雜談
一? 綜述:1、不要使用接口定義常量
2、自己少用標(biāo)志接口
3、不要繼承具體類(lèi)
4、類(lèi)層次的中間節(jié)點(diǎn)應(yīng)該是接口或者抽象類(lèi),葉子是具體類(lèi)
5、子類(lèi)應(yīng)當(dāng)擴(kuò)展父類(lèi)的責(zé)任,而不是覆寫(xiě)父類(lèi)的責(zé)任
6、面向接口編程
7、不要濫用繼承,組合優(yōu)先于繼承
java中設(shè)計(jì)不當(dāng)?shù)念?lèi):calendar:作為接口,含有與具體的歷法(羅馬歷法)相關(guān)的常量,不能擴(kuò)展到中國(guó)的陰歷歷法(不符合開(kāi)閉原則)
??????????????????? properies類(lèi):濫用繼承,繼承至hashtable,應(yīng)當(dāng)使用聚合
8、笛比特法則:只與自己的直接朋友通信,不與陌生人通信(1)狹義笛比特法則:只與朋友通訊,通過(guò)自己的朋友傳遞間接的調(diào)用(2)結(jié)合依賴(lài)倒轉(zhuǎn)原則修改:不必通過(guò)朋友傳遞間接的調(diào)用,通過(guò)陌生人的抽象接口調(diào)用陌生人的行為(依舊不能與具體的陌生人發(fā)生通信)
9、盡量降低類(lèi)中成員的訪問(wèn)權(quán)限,不要設(shè)計(jì)退化類(lèi)(類(lèi)似c中struct)。
??????? java中的point2D以及Dinmension2D類(lèi)有這種設(shè)計(jì)缺陷(不過(guò)這種情況問(wèn)題不大)
10、如果多個(gè)具體的產(chǎn)品類(lèi)沒(méi)有共同的商業(yè)邏輯,就可以把它們抽象到一個(gè)接口中,如果有共同的商業(yè)邏輯,就把共同的部分抽象到抽象類(lèi)中,共同的部分盡量向類(lèi)繼承層次的上層移動(dòng),以達(dá)到復(fù)用的目的
二?? 工廠模式
1、簡(jiǎn)單工廠模式:參與角色:工廠/抽象產(chǎn)品類(lèi)/具體產(chǎn)品類(lèi)
?? 缺點(diǎn):添加新產(chǎn)品的時(shí)候,雖然產(chǎn)品相關(guān)代碼符合開(kāi)閉原則,但對(duì)工廠類(lèi)本身并不符合,需要修改其中的產(chǎn)生產(chǎn)品方法或者添加新的產(chǎn)生方法(工廠里實(shí)現(xiàn)的不同造成的修改不同)來(lái)支持新的產(chǎn)品類(lèi)
?? 退化方式:省略掉工廠角色,抽象產(chǎn)品類(lèi)擔(dān)任具體產(chǎn)品類(lèi)的工廠角色:提供靜態(tài)的getInstance方法,比如java類(lèi)庫(kù)中的DateFormat類(lèi),(本人認(rèn)為這樣很不符合開(kāi)閉原則,父類(lèi)中出現(xiàn)與具體子類(lèi)相關(guān)的代碼,不方便擴(kuò)展,添加新產(chǎn)品的時(shí)候,修改的時(shí)候缺點(diǎn)與原簡(jiǎn)單工廠的工廠角色類(lèi)似)
2、工廠方法模式:參與角色:抽象工廠類(lèi)/具體工廠類(lèi)/抽象產(chǎn)品類(lèi)/具體產(chǎn)品類(lèi)
???? 消除了簡(jiǎn)單工廠的缺點(diǎn)
3、抽象工廠模式:簡(jiǎn)單工廠模式與工廠方法模式的結(jié)合
4、單例模式:餓漢和懶漢兩種,前者將本身對(duì)象作為靜態(tài)私有屬性事先生成,后者推遲到調(diào)用的時(shí)候,后者需要考慮多線(xiàn)程的時(shí)候,前面需要加線(xiàn)程安全關(guān)鍵字(注意),java中還是前者為優(yōu)。
?? 不要濫用單例,只有系統(tǒng)要求只有一個(gè)類(lèi)的實(shí)例的時(shí)候才調(diào)用
?? 有的單例可能有狀態(tài)屬性,這就為多例模式提供了可能
?? 含有私有屬性的類(lèi)作成單例的時(shí)候尤其要注意:一是私有屬性的線(xiàn)程安全,確實(shí)需要的時(shí)候可以加線(xiàn)程安全關(guān)鍵字,比如系統(tǒng)中的log類(lèi),二是確認(rèn)這些屬性是不是可以所有線(xiàn)程共享的,類(lèi)似普通類(lèi)的static
三?? 各種具體模式(1)
1、建造模式:參與角色4個(gè):指導(dǎo)者、抽象建造對(duì)象、具體建造對(duì)象、產(chǎn)品
????? 一個(gè)復(fù)雜的產(chǎn)品有很多的零部件,就可以使用具體的建造對(duì)象來(lái)一一構(gòu)造
2、原始模式:深拷貝、淺拷貝
3、適配器模式:將adaptee類(lèi)適配成目標(biāo)接口
4、合成模式:參與角色:composite接口、樹(shù)枝節(jié)點(diǎn)類(lèi)、樹(shù)葉節(jié)點(diǎn)類(lèi)
????? 分成透明式和安全式兩種,各有優(yōu)缺點(diǎn)
????? (1)前者將管理子對(duì)象的方法放到接口中,這樣樹(shù)型結(jié)構(gòu)中的所有對(duì)象都是透明的,都可以統(tǒng)一調(diào)用,但是葉節(jié)點(diǎn)并沒(méi)有管理子對(duì)象的能力,因此透明但不安全
????? (2)后者將管理子對(duì)象的方法下放到樹(shù)枝節(jié)點(diǎn)類(lèi)中,這樣安全但不透明
5、裝飾模式:繼承已有類(lèi)的接口,提供和已有類(lèi)相同的方法,并對(duì)已有類(lèi)的功能提供擴(kuò)展(通過(guò)組合已有對(duì)象,調(diào)用已有對(duì)象方法的時(shí)候加入新的代碼)
????? (1)透明的裝飾模式(純粹的裝飾模式):裝飾類(lèi)、被裝飾類(lèi)繼承于同一接口,而且裝飾類(lèi)只實(shí)現(xiàn)接口的方法,不提供額外方法的實(shí)現(xiàn),調(diào)用該類(lèi)的時(shí)候使用接口聲明調(diào)用(實(shí)例化當(dāng)然還是自己的構(gòu)造函數(shù)),即該類(lèi)的所有方法都是透明的
????? (2)半透明的裝飾模式(退化的裝飾模式):裝飾類(lèi)、被裝飾類(lèi)繼承于同一接口,裝飾類(lèi)不僅實(shí)現(xiàn)接口的方法,還提供額外方法的實(shí)現(xiàn),這樣要調(diào)用它獨(dú)特的方法的時(shí)候就必須使用它本身來(lái)調(diào)用,退化到一半裝飾模式、一半適配器模式。
posted on 2006-09-01 13:45 liaojiyong 閱讀(206) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): Java