24種設(shè)計模式介紹與6大設(shè)計原則_第1頁
24種設(shè)計模式介紹與6大設(shè)計原則_第2頁
24種設(shè)計模式介紹與6大設(shè)計原則_第3頁
24種設(shè)計模式介紹與6大設(shè)計原則_第4頁
24種設(shè)計模式介紹與6大設(shè)計原則_第5頁
已閱讀5頁,還剩331頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

您的設(shè)計模式目錄第章策略模式【STRATEGYPATTERN】 41第章模式【PROXYPATTERN】 82第章單例模式【SINGLETONPATTERN】 123第章多例模式【MULTITIONPATTERN】 164第章工廠模式【FACTORYMETHODPATTERN】 195第章抽象工廠模式【ABSTRACTFACTORYPATTERN】 316第章門面模式【FACADEPATTERN】 447第章適配器模式【ADAPTERPATTERN】 518第章模板模式【TEMPLATEMETHODPATTERN】 639第章建造者模式【BUILDERPATTERN】 8210第章橋梁模式【BRIDGEPATTERN】 您的設(shè)計模式目錄第章策略模式【STRATEGYPATTERN】 41第章模式【PROXYPATTERN】 82第章單例模式【SINGLETONPATTERN】 123第章多例模式【MULTITIONPATTERN】 164第章工廠模式【FACTORYMETHODPATTERN】 195第章抽象工廠模式【ABSTRACTFACTORYPATTERN】 316第章門面模式【FACADEPATTERN】 447第章適配器模式【ADAPTERPATTERN】 518第章模板模式【TEMPLATEMETHODPATTERN】 639第章建造者模式【BUILDERPATTERN】 8210第章橋梁模式【BRIDGEPATTERN】 9711第章命令模式【DPATTERN】 11212第章裝飾模式【DECORATORPATTERN】 12613第章迭代器模式【ITERATORPATTERN】 13714第章組合模式【COMPOSITEPATTERN】 14715第章觀察者模式【OBSERVERPATTERN】 17516第章責(zé)任鏈模式【CHAINOFRESPONSIBILITYPATTERN】 19417第章者模式【VISITORPATTERN】 21018第章狀態(tài)模式【STATEPATTERN】 23619第章原型模式【PROTOTYPEPATTERN】 25520第章中介者模式【MEDIATORPATTERN】 26821第章解釋器模式【INTERPRETERPATTERN】 28622第章亨元模式【FLYWEIGHTPATTERN】 28723第章備忘錄模式【MEMENTOPATTERN】 28824第章模式大PK 28925第章六大設(shè)計原則 29026單一職責(zé)原則【SINGLERESPONSIBILITYPRINCIPLE】 290里氏替換原則【LISKOVSUBSTITUTIONPRINCIPLE】 297第2頁您的設(shè)計模式依賴倒置原則【DEPENDENCEINVERSIONPRINCIPLE】 309接口 原則【INTERFACESEGREGATIONPRINCIPLE】 310法則【您的設(shè)計模式依賴倒置原則【DEPENDENCEINVERSIONPRINCIPLE】 309接口 原則【INTERFACESEGREGATIONPRINCIPLE】 310法則【LOWOFDEMETER】 32026.526.6 開閉原則【OPENPRINCIPLE】 330第27章混編模式講解 332第28章更新:334相關(guān)說明 335相關(guān)說明 335第29章后序 336第3頁您的設(shè)計模式1章給(伴郎)三個錦囊妙計,說是按拆開解決棘手問題,嘿,還別說,真是解決了大問題,搞到最后是了夫人又折兵呀,那咱們先看看這個場景是什么樣子的。先說這個場景中的要素:計,一個錦囊,一個,妙計是同志給的,妙計是放置在錦囊里,俗稱就是錦囊妙計嘛,那就是一個干活的人,從錦囊中取出妙計,執(zhí)行,然后獲勝,用JAVA程序怎么表現(xiàn)這個呢?我們先看類圖:計是同一類型的東東,那咱就寫個接口:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mglad您的設(shè)計模式1章給(伴郎)三個錦囊妙計,說是按拆開解決棘手問題,嘿,還別說,真是解決了大問題,搞到最后是了夫人又折兵呀,那咱們先看看這個場景是什么樣子的。先說這個場景中的要素:計,一個錦囊,一個,妙計是同志給的,妙計是放置在錦囊里,俗稱就是錦囊妙計嘛,那就是一個干活的人,從錦囊中取出妙計,執(zhí)行,然后獲勝,用JAVA程序怎么表現(xiàn)這個呢?我們先看類圖:計是同一類型的東東,那咱就寫個接口:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*首先定一個策略接口,這是**/老人家給的三個錦囊妙計的接口publicinterfaceIStrategy{//每個錦囊妙計都是一個可執(zhí)行的算法publicvoidoperate();}第4頁您的設(shè)計模式然后再寫三個實現(xiàn)類,有計嘛:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*找喬 幫忙,使*/不能殺publicclass您的設(shè)計模式然后再寫三個實現(xiàn)類,有計嘛:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*找喬 幫忙,使*/不能殺publicclassBackDoorimplementsIStrategy{publicvoidoperate(){找喬}幫忙,讓給施加");}packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*求*/開個綠燈publicclassGivenGreenLightimplementsIStrategy{publicvoidoperate(){求}開個綠燈,放行!");}packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.孫夫人斷后,擋住追兵*/publicclassBlockEnemyimplementsIStrategy{publicvoidoperate(){第5頁您的設(shè)計模式System.out.println("孫夫人斷后,擋住追兵");}}好了,大家看看,計是有了,那需要有個地方放這些妙計呀,放錦囊呀:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemy您的設(shè)計模式System.out.println("孫夫人斷后,擋住追兵");}}好了,大家看看,計是有了,那需要有個地方放這些妙計呀,放錦囊呀:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/publicclassContext{//構(gòu)造函數(shù),你要使用那個妙計privateIStrategystraegy;publicContext(IStrategystrategy){this.straegy=strategy;}//使用計謀了,看我出招了publicvoidoperate(){this.straegy.operate();}}然后就是雄赳赳的揣著三個錦囊,拉著已步入老年行列的、還想著娶純情少女的、色迷迷的爺子去入贅了,嗨,還別說,的計還真是不錯,瞅瞅:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/publicclassZhaoYun{/****/出場了,他根據(jù)給他的交代,依次拆開妙計publicstaticvoidmain(String[]Contextcontext;args){第6頁您的設(shè)計模式//剛剛到吳國的時候拆第一個System.out.println("剛剛到吳國的時候拆第一個 ");contextnewContext(newBackDoor())//拿到妙計context.operate();//拆開執(zhí)行您的設(shè)計模式//剛剛到吳國的時候拆第一個System.out.println("剛剛到吳國的時候拆第一個 ");contextnewContext(newBackDoor())//拿到妙計context.operate();//拆開執(zhí)行//樂不思蜀了,拆第二個了System.out.println("樂不思蜀了,拆第二個了 ");context=newContext(newGivenGreenLight());context.operate();//執(zhí)行了第二個錦囊了//的小兵追了,咋辦?拆第三個System.out.println("");的小兵追了,咋辦?拆第三個context=newContext(newBlockEnemy());context.operate();//孫夫人退兵/**問題來了:實際不知道是那個策略呀,他只知道拆第一個錦囊,*而不知道是BackDoor這個妙計,咋辦?似乎這個策略模式已經(jīng)把計謀名稱寫出來了*third,沒人會說你錯!**/}}個不多說了,領(lǐng)會吧。第7頁您的設(shè)計模式2章什么是模式呢?我很忙,忙的沒空理你,那你要找我呢就先找人吧,那人總要知道被人能做哪些事情不能做哪些事情吧,那就是兩個人具備同一個接口,人雖然不能干活,但是被的人能干活呀。比如西門慶找,那做,表現(xiàn)在時這樣的:先定義一種類型的女人:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定義一種類型的女人,*/和您的設(shè)計模式2章什么是模式呢?我很忙,忙的沒空理你,那你要找我呢就先找人吧,那人總要知道被人能做哪些事情不能做哪些事情吧,那就是兩個人具備同一個接口,人雖然不能干活,但是被的人能干活呀。比如西門慶找,那做,表現(xiàn)在時這樣的:先定義一種類型的女人:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定義一種類型的女人,*/和都屬于這個類型的女人publicinterfaceKindWomen{//這種類型的女人能做什么事情呢?publicvoidmakeEyesWithMan();//拋媚眼publicvoidhappyWithMan();//happywhat?Youknowthat!}一種類型嘛,那肯定是接口,然后定義:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定一個*/是什么樣的人publicclassPanJinLianimplementsKindWomen{publicvoidhappyWithMan(){System.out.println("}在和男人做那個 ");第8頁您的設(shè)計模式publicvoidmakeEyesWithMan(){System.out.println("拋媚眼");}}再定一個 的:xy;/******@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewith您的設(shè)計模式publicvoidmakeEyesWithMan(){System.out.println("拋媚眼");}}再定一個 的:xy;/******@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.這個人,她太老了,是個男人都看不上,!*/publicclassWangPoimplementsKindWomen{privateKindWomenkindWomen;publicWangPo()//默認的話,是的this.kindWomen=newPanJinLian();}//她可以是KindWomen的任何一個女人的,只要你是這一類型publicWangPo(KindWomenkindWomen){this.kindWomen=kindWomen;}publicvoidhappyWithMan(){this.kindWomen.happyWithMan();// 老了,干不了,可以讓年輕的代替}publicvoidmakeEyesWithMan(){this.kindWomen.makeEyesWithMan();//這么大了,誰看她拋媚眼?!}}兩個女主角都上場了,男主角也該出現(xiàn)了:第9頁您的設(shè)計模式xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定義一個西門慶,這*/中餓鬼publicclassXiMenQing{/**水滸里是這樣寫的:西門慶被*被就開始撮合兩人好事,作為的人*收了不少好處費,那我們假設(shè)一下:*如果沒有您的設(shè)計模式xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定義一個西門慶,這*/中餓鬼publicclassXiMenQing{/**水滸里是這樣寫的:西門慶被*被就開始撮合兩人好事,作為的人*收了不少好處費,那我們假設(shè)一下:*如果沒有*/在中間牽線,這兩個不要臉的能成嗎?難說的很!publicstaticvoidmain(String[]args){//把 叫出來WangPowangPo=newWangPo();//然后西門慶就說,我要和happy,然后戲:wangPo.makeEyesWithMan();//看到?jīng)],雖然表面上wangPo.happyWithMan();}}那這就是活生生的一個例子,通過人實現(xiàn)了某種目的,如果真去掉這個中間環(huán)節(jié),直接是西門慶和勾搭,估計很難成就武松殺嫂。那我們再考慮一下,水滸里還有沒有這類型的女人?有,的老婆賈氏(就是和那個固管家茍合的那個做她的 :把賈氏素描出來:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/publicclassJiaShiimplementsKindWomen{publicvoidhappyWithMan(){System.out.println("賈氏正在Happy中 ");第10頁您的設(shè)計模式}publicvoidmakeEyesWithMan(){System.out.println("賈氏拋媚眼");}}西門慶勾賈氏:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledge您的設(shè)計模式}publicvoidmakeEyesWithMan(){System.out.println("賈氏拋媚眼");}}西門慶勾賈氏:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定義一個西門慶,這*/中餓鬼publicclassXiMenQing{publicstaticvoidmain(String[]args)//改編一下歷史,賈氏被西門慶勾走:JiaShijiaShinewJiaShi();{WangPowangPonewWangPo(jiaShi)//讓作為賈氏的 人wangPo.makeEyesWithMan();wangPo.happyWithMan();}}活,好,我交給幕后的類去類能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥的很,同一個接口唄。第11頁您的設(shè)計模式3章這個模式是很有意思,而且比較簡單,但是我還是要說因為它使用的是如此的廣泛,如此的有人緣,單例就是單一、獨苗的意思,那什么是獨一份呢?你的思維是獨一份,除此之外還有什么不能山寨的呢?我們舉個比較難的對象:的歷史上很少出現(xiàn)兩個并存的時期,是有,但不多,那我們就認為是個單例模式,在這的,的先看類圖:然后我們看程序?qū)崿F(xiàn),先定一個:packagecom.cbf4life.singleton1;/******/@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledge您的設(shè)計模式3章這個模式是很有意思,而且比較簡單,但是我還是要說因為它使用的是如此的廣泛,如此的有人緣,單例就是單一、獨苗的意思,那什么是獨一份呢?你的思維是獨一份,除此之外還有什么不能山寨的呢?我們舉個比較難的對象:的歷史上很少出現(xiàn)兩個并存的時期,是有,但不多,那我們就認為是個單例模式,在這的,的先看類圖:然后我們看程序?qū)崿F(xiàn),先定一個:packagecom.cbf4life.singleton1;/******/@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.的歷史上都是一個朝代一個,有兩個 的話,必然要PK出一個出來publicclassEmperor{privatestaticEmperoremperornull;//定義一個放在那里,然后給這個名字privateEmperor(){//世俗和道德約束你,目的就是不讓你產(chǎn)生第二個}publicstaticEmperorgetInstance(){第12頁您的設(shè)計模式if(emperor==null){//如果 還沒有定義,那就定一個emperor=newEmperor();}returnemperor;}// 叫什么名字呀publicstaticvoidemperorInfo(){System.out您的設(shè)計模式if(emperor==null){//如果 還沒有定義,那就定一個emperor=newEmperor();}returnemperor;}// 叫什么名字呀publicstaticvoidemperorInfo(){System.out.println("我就是某某某 ");}}然后定義大臣:packagecom.cbf4life.singleton1;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*大臣是天天要面見*/,見的@SuppressWarnings("all")publicclassMinister{/***@paramargs*/publicstaticvoidmain(String[]args){//第一天Emperoremperor1=Emperor.getInstance();emperor1.emperorInfo();//第一天見的叫什么名字呢?//第二天Emperoremperor2=Emperor.getInstance();Emperor.emperorInfo();//第三天Emperoremperor3=Emperor.getInstance();emperor2.emperorInfo();//三天見的都是同一個人,榮幸吧!}}第13頁您的設(shè)計模式看到?jīng)],大臣天天見到的都是同一個,產(chǎn)生錯亂情況,反正都是一個,是好是壞就這一個,只要提到,大家都知道指的是誰,清晰,而又明確。問題是這是通常情況,還有個例的,如同一個時期同一個朝代有兩個,怎么辦?單例模式很簡單,就是在構(gòu)造函數(shù)中多了加一個構(gòu)造函數(shù),privateB/SHTTPRequestJ2EE的容器上后都創(chuàng)建了一個線程,每個線程都要創(chuàng)建同一個單例對象,怎么辦?,好,我們寫一個通用的單例程序,然后分析一下:packagecom.cbf4life.singleton3;/**@authorcbf4Lifecbf4life@126.comI'mglad您的設(shè)計模式看到?jīng)],大臣天天見到的都是同一個,產(chǎn)生錯亂情況,反正都是一個,是好是壞就這一個,只要提到,大家都知道指的是誰,清晰,而又明確。問題是這是通常情況,還有個例的,如同一個時期同一個朝代有兩個,怎么辦?單例模式很簡單,就是在構(gòu)造函數(shù)中多了加一個構(gòu)造函數(shù),privateB/SHTTPRequestJ2EE的容器上后都創(chuàng)建了一個線程,每個線程都要創(chuàng)建同一個單例對象,怎么辦?,好,我們寫一個通用的單例程序,然后分析一下:packagecom.cbf4life.singleton3;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.通用單例模式*/publicclassSingletonPattern{privatestaticSingletonPatternsingletonPattern=null;//限制住不能直接產(chǎn)生一個實例privateSingletonPattern(){}publicSingletonPatterngetInstance(){){ this.singletonPattern=newSingletonPattern(); }returnthis.singletonPattern;}}ABAthis.singletonPatternnewSingletonPattern(0.0010.001Bif(this.singletonPattern==null),你說這個時候這個條件是true還是false?是true,那然后呢?線程BSingletonPattern第14頁您的設(shè)計模式如果你這個單例是去拿一個序列號或者創(chuàng)建一個信號資源的時候,會怎么樣?業(yè)務(wù)邏輯混亂!數(shù)據(jù)一致性校驗失??!最重要的是你從代碼上還看不出什么問題,這最的!因為這種情況基本上你是重現(xiàn)不了的,不寒而栗吧,那怎么修改?有很多種方案,我就說一種,能簡單的、徹底解決問題的方案:packagecom.cbf4life.singleton3;/**@authorcbf4Lifecbf4life@126.comI'm您的設(shè)計模式如果你這個單例是去拿一個序列號或者創(chuàng)建一個信號資源的時候,會怎么樣?業(yè)務(wù)邏輯混亂!數(shù)據(jù)一致性校驗失??!最重要的是你從代碼上還看不出什么問題,這最的!因為這種情況基本上你是重現(xiàn)不了的,不寒而栗吧,那怎么修改?有很多種方案,我就說一種,能簡單的、徹底解決問題的方案:packagecom.cbf4life.singleton3;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.通用單例模式*/publicclassSingletonPattern{privatestaticfinalSingletonPatternsingletonPattern=newSingletonPattern();//限制住不能直接產(chǎn)生一個實例privateSingletonPattern(){}publicsynchronizedstaticSingletonPatterngetInstance(){returnsingletonPattern;}}newsingletonpattern,getInstance()直接返回給你,解決問題!第15頁您的設(shè)計模式4章,期間的算不算,不算,各自,各有各的地盤,國號不同。大家還記得《石灰吟》嗎?作者是誰?,他是被誰殺死的?鎮(zhèn),對,就是那個在土木堡之變中被瓦刺俘虜?shù)模环敽?,他弟弟鈺?dāng)上了,就是明景帝,估計當(dāng)上后樂瘋了,忘記把老哥 鎮(zhèn)削為太上皇了,我Shit,的歷2,你說這期間的大臣多郁悶,兩個耶,兩個精神依附對象呀。(new一個對象沒啥差別,不討論)怎么實現(xiàn)呢,看我出招,先看類圖:然后看程序,先把兩個定義出來:packagecom.cbf4life.singleton2;importjava.util.ArrayList;importjava.util.Random;/*******@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.您的設(shè)計模式4章,期間的算不算,不算,各自,各有各的地盤,國號不同。大家還記得《石灰吟》嗎?作者是誰?,他是被誰殺死的?鎮(zhèn),對,就是那個在土木堡之變中被瓦刺俘虜?shù)?,被俘虜后,他弟弟鈺?dāng)上了,就是明景帝,估計當(dāng)上后樂瘋了,忘記把老哥 鎮(zhèn)削為太上皇了,我Shit,的歷2,你說這期間的大臣多郁悶,兩個耶,兩個精神依附對象呀。(new一個對象沒啥差別,不討論)怎么實現(xiàn)呢,看我出招,先看類圖:然后看程序,先把兩個定義出來:packagecom.cbf4life.singleton2;importjava.util.ArrayList;importjava.util.Random;/*******@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.的話,必然要PK出一個的歷史上都是一個朝代一個 ,有兩個出來。問題出來了:如果一個時間,出現(xiàn)了兩個怎么辦?比如土木堡之變后,被俘虜,明景帝即位,但是明景帝當(dāng)上!削為太上皇,*也就是在這一個多月的時間內(nèi),**/竟然有兩個第16頁您的設(shè)計模式@SuppressWarnings("all")publicclassEmperor{privatestaticintmaxNumOfEmperor2;//最多只能有連個叫什么名字//privatestaticArrayListemperorList=newArrayList(maxNumOfEmperor您的設(shè)計模式@SuppressWarnings("all")publicclassEmperor{privatestaticintmaxNumOfEmperor2;//最多只能有連個叫什么名字//privatestaticArrayListemperorList=newArrayList(maxNumOfEmperor);帝的列表;privatestaticintcountNumOfEmperor=0;//正在被人尊稱的是那個////先把2個static{//把所有的都產(chǎn)生出來for(inti=0;i<maxNumOfEmperor;i++){emperorList.add(newEmperor("皇"+(i+1)+"帝"));}}//就這么多了,不再推舉一個(new一個)privateEmperor(){//世俗和道德約束你,目的就是不讓你產(chǎn)生第二個}privateEmperor(Stringinfo){emperorInfoList.add(info);}publicstaticEmperorgetInstance(){Randomrandom=newRandom();countNumOfEmperor=random.nextInt(maxNumOfEmperor);//隨機拉出一個,只要是個精神就成return(Emperor)emperorList.get(countNumOfEmperor);}//叫什么名字呀publicstaticvoidemperorInfo(){}}那大臣是比較悲慘了,兩個呀,兩個老子呀,怎么拜呀,不管了,只要是個就成:packagecom.cbf4life.singleton2;第17頁您的設(shè)計模式/***@authorcbf4Lifecbf4life@126.comI'mgladtoshareTND,不管了,找到個*/myknowledgewith您的設(shè)計模式/***@authorcbf4Lifecbf4life@126.comI'mgladtoshareTND,不管了,找到個*/myknowledgewithyouall.,磕頭,請按就成了!@SuppressWarnings("all")publicclassMinister{/***@paramargs*/publicstaticvoidmain(String[]args){intministerNum=10//10個大臣for(inti=0;i<ministerNum;i++){Emperoremperor=Emperor.getInstance();System.out.print("第"+(i+1)+"個大臣emperor.emperorInfo();的是:");}}}那各位看官就可能會不屑了:有的大臣有骨氣,只拜一個,你怎么處理?這個問題太簡單,第18頁您的設(shè)計模式5章工廠女媧補天的故事大家都聽說過吧,不說這個,說女媧創(chuàng)造人的故事,可不是“造人”的工作,這個詞被現(xiàn)代人了。這個故事是說,女媧在補了天后,下到凡間一看,,風(fēng)景,天空是藍的,清澈的,空氣是清新的,,然后就待時間長了就有點寂寞了,沒有動物,這些看的到都是靜態(tài)的東西呀,怎么辦?)開始創(chuàng)建人,具體過程是這樣的:先是泥巴捏,然后放八卦爐里烤,再扔到地上成長,但是意外總是會產(chǎn)生的:~~,感覺應(yīng)該熟了,往地上一扔,biu~,一個白人誕生了,沒烤熟!第二次烤泥人,茲茲茲茲茲茲茲茲~~,上次都沒烤熟,這次多烤會兒,往地上一扔,嘿,熟過頭了,哪!~茲~茲~,一邊烤一邊,嘿,正正好,Perfect:RB不屬此列】(會加上去,之前的會一個一個的補充,目的是讓大家舒服,愉悅,就想要,就像是看小說一樣,目標(biāo),目標(biāo)而已,能不能實現(xiàn)就看大家給)那這個過程我們就用表現(xiàn),首先定義一個人類的總稱:第19頁您的設(shè)計模式5章工廠女媧補天的故事大家都聽說過吧,不說這個,說女媧創(chuàng)造人的故事,可不是“造人”的工作,這個詞被現(xiàn)代人了。這個故事是說,女媧在補了天后,下到凡間一看,,風(fēng)景,天空是藍的,清澈的,空氣是清新的,,然后就待時間長了就有點寂寞了,沒有動物,這些看的到都是靜態(tài)的東西呀,怎么辦?)開始創(chuàng)建人,具體過程是這樣的:先是泥巴捏,然后放八卦爐里烤,再扔到地上成長,但是意外總是會產(chǎn)生的:~~,感覺應(yīng)該熟了,往地上一扔,biu~,一個白人誕生了,沒烤熟!第二次烤泥人,茲茲茲茲茲茲茲茲~~,上次都沒烤熟,這次多烤會兒,往地上一扔,嘿,熟過頭了,哪!~茲~茲~,一邊烤一邊,嘿,正正好,Perfect:RB不屬此列】(會加上去,之前的會一個一個的補充,目的是讓大家舒服,愉悅,就想要,就像是看小說一樣,目標(biāo),目標(biāo)而已,能不能實現(xiàn)就看大家給)那這個過程我們就用表現(xiàn),首先定義一個人類的總稱:第19頁您的設(shè)計模式packagecom.cbf4life;/***@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledge*/publicinterfaceHuman您的設(shè)計模式packagecom.cbf4life;/***@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledge*/publicinterfaceHuman{//首先定義什么是人類withyouall.//人是愉快的,會笑的,本來是想用spublicvoidlaugh();laugh更合適,好長時間沒有大笑了;//人類還會哭,代表痛苦publicvoidcry();//人類會說話publicvoidtalk();}然后定義具體的人種:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*黃色人種,這個翻譯的*/確,將就點吧publicclassYellowHumanimplementsHuman{publicvoidcry(){黃色人種會哭");}publicvoidlaugh(){黃色人種會大笑,}呀!");publicvoidtalk(){System.out.println("黃色人種會說話,說的字節(jié)");第20頁您的設(shè)計模式}}白色人種:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewith您的設(shè)計模式}}白色人種:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.白色人種*/publicclassWhiteHumanimplementsHuman{publicvoidcry(){白色人種會哭");}publicvoidlaugh(){System.out.println("白色人種會大笑,侵略的笑聲");}publicvoidtalk(){白色人種會說話,}都是但是單字節(jié)!");}黑色人種:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.人的意思,不懂,沒跟老外說話*黑色人種,記得*/英語,說blackman是publicclassBlackHumanimplementsHuman{publicvoidcry(){System.out.println("");第21頁您的設(shè)計模式}publicvoidlaugh(){}");publicvoidtalk(){System.out.println("可以說話,人聽不懂");}}人種也定義完畢了,那我們把八卦爐定義出來:packagecom.cbf4life;importjava.util.List;importjava.util.Random;/*****您的設(shè)計模式}publicvoidlaugh(){}");publicvoidtalk(){System.out.println("可以說話,人聽不懂");}}人種也定義完畢了,那我們把八卦爐定義出來:packagecom.cbf4life;importjava.util.List;importjava.util.Random;/*****@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.講女媧造人的故事,這個故事梗概是這樣的:*很久很久以前,開辟了天地,用身軀造出日月星辰、山川草木,天地一片繁華Oneday,女媧下界走了一遭,哎!太寂寞,太孤獨了,沒個會笑的、會哭的、會說話的東東(后來這個成了太白金星的寶貝)中烤,就有了人:*我們把這個生產(chǎn)人的過程用Java程序表現(xiàn)出來:*/publicclassHumanFactory{//定一個烤箱,泥巴塞進去,人就出來,這個太先進了publicstaticHumancreateHuman(Classc){Humanhuman=null;//定義一個類型的人類try{human=(Human)Class.forName(c.getName()).newInstance();//產(chǎn)生一個人種}catch(InstationExceptione//你要是不說個人種顏色的話,沒法烤,要白的黑,你說話了烤System.out.println("必須指定人種的顏色");...第22頁您的設(shè)計模式System.out.println("人種定義錯誤!");catch(ClassNotFoundExceptione//你隨便說個人種,我到哪里給你去?!System.out.println("混蛋,你指定的人種找不到!");}return您的設(shè)計模式System.out.println("人種定義錯誤!");catch(ClassNotFoundExceptione//你隨便說個人種,我到哪里給你去?!System.out.println("混蛋,你指定的人種找不到!");}returnhuman;}}然后我們再把女媧出來:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/publicclassNvWa{publicstaticvoidmain(String[]args){//女媧第一次造人,試驗性質(zhì),,火候不足,缺陷System.out.println(" 造出的第一批人是這樣的:白人");HumanwhiteHuman=HumanFactory.createHuman(WhiteHuman.class);whiteHuman.cry();whiteHuman.laugh();whiteHuman.talk();//女媧第二次造人,火候加足點,然后又出了個次品,System.out.println("\n\n 的第二批人是這樣的:");HumanblackHuman=HumanFactory.createHuman(BlackHuman.class);blackHuman.cry();blackHuman.laugh();blackHuman.talk();//第三批人了,這次火候掌握的正好,黃色人種(不寫黃人,免得引起歧義),備注:RB人不屬于此列System.out.println("\n\n 造出的第三批人是這樣的:黃色人種");第23頁您的設(shè)計模式HumanyellowHuman=HumanFactory.createHuman(YellowHuman.class);yellowHuman.cry();yellowHuman.laugh();yellowHuman.talk()}}這樣就熱鬧起來了,人也有了,但是這樣創(chuàng)建太累了,神仙也會累的,那怎么辦?神仙就想了:我塞進去一團泥巴,隨機出來一群人,管他是、白人、黃人,只要是人就成(你看看,神仙都偷您的設(shè)計模式HumanyellowHuman=HumanFactory.createHuman(YellowHuman.class);yellowHuman.cry();yellowHuman.laugh();yellowHuman.talk()}}這樣就熱鬧起來了,人也有了,但是這樣創(chuàng)建太累了,神仙也會累的,那怎么辦?神仙就想了:我塞進去一團泥巴,隨機出來一群人,管他是、白人、黃人,只要是人就成(你看看,神仙都偷懶,何況是我們?nèi)薱reateHuman():packagecom.cbf4life;importjava.util.List;classHumanFactory{//定一個烤箱,泥巴塞進去,人就出來,這個太先進了publicstaticHumancreateHuman(Classc){Humanhuman=null;//定義一個類型的人類第24頁您的設(shè)計模式try{human(Human)Class.forName(c.getName()).newInstance();//產(chǎn)生一個人種}catch(InstationExceptione//你要是不說個人種顏色的話,沒法烤,要白的黑,你說話了烤System.out.println("必須指定人種的顏色"您的設(shè)計模式try{human(Human)Class.forName(c.getName()).newInstance();//產(chǎn)生一個人種}catch(InstationExceptione//你要是不說個人種顏色的話,沒法烤,要白的黑,你說話了烤System.out.println("必須指定人種的顏色");...System.out.println("人種定義錯誤!");catch(ClassNotFoundExceptione//你隨便說個人種,我到哪里給你去?!System.out.println("混蛋,你指定的人種找不到!");}returnhuman;}//女媧生氣了,把一團泥巴塞到八卦爐,哎產(chǎn)生啥人種就啥人種publicstaticHumancreateHuman(){Humanhuman=null;//定義一個類型的人類List<ClassconcreteHumanListClassUtils.getAllClassByInterface(Human.class);//定義了多少人種//八卦爐Randomrandom=newRandom();intrand=random.nextInt(concreteHumanList.size());human=createHuman(concreteHumanList.get(rand));returnhuman;}}然后看女媧是如何做的:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/第25頁您的設(shè)計模式publicclassNvWa{publicstaticvoidmain(String[]args){//女媧第一次造人,試驗性質(zhì),,火候不足,缺陷System.out.println(" 造出的第一批人是這樣的:白人您的設(shè)計模式publicclassNvWa{publicstaticvoidmain(String[]args){//女媧第一次造人,試驗性質(zhì),,火候不足,缺陷System.out.println(" 造出的第一批人是這樣的:白人");HumanwhiteHuman=HumanFactory.createHuman(WhiteHuman.class);whiteHuman.cry();whiteHuman.laugh();whiteHuman.talk();//女媧第二次造人,火候加足點,然后又出了個次品,System.out.println("\n\n 的第二批人是這樣的:");HumanblackHuman=HumanFactory.createHuman(BlackHuman.class);blackHuman.cry();blackHuman.laugh();blackHuman.talk();//第三批人了,這次火候掌握的正好,黃色人種(不寫黃人,免得引起歧義),備注:RB人不屬于此列System.out.println("\n\n 造出的第三批人是這樣的:黃色人種");HumanyellowHuman=HumanFactory.createHuman(YellowHuman.class);yellowHuman.cry();yellowHuman.laugh();yellowHuman.talk();//女媧煩躁了,愛是啥人種就是啥人種,燒吧for(inti=0;i<;i++){System.out.println("\n\n隨機產(chǎn)生人種了 "+i);Humanhuman=HumanFactory.createHuman();human.cry();human.laugh();human.talk();}}}第26頁您的設(shè)計模式哇,packagecom.cbf4life;importjava.io.File;java.io.IOException;.URL;java.util.ArrayList;java.util.List;/***@author您的設(shè)計模式哇,packagecom.cbf4life;importjava.io.File;java.io.IOException;.URL;java.util.ArrayList;java.util.List;/***@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyou***/all.@SuppressWarnings("all")publicclassClassUtils{//給一個接口,返回這個接口的所有實現(xiàn)類publicstaticList<Class>getAllClassByInterface(Classc){List<ClassreturnClassListnewArrayList<Class>();//返回結(jié)果//如果不是一個接口,則不做處理if(c.isInterface()){StringpackageNamec.getPackage().getName();//獲得當(dāng)前的try{List<Class>allClassgetClasses(packageName);//獲得當(dāng)前包下以//是否是同一個接口for(inti=0;i<allClass.size();i++){if(c.isAssignableFrom(allClass.get(i))){// 是不是一個接口if(!c.equals(allClass.get(i))){//本身不加進去returnClassList.add(allClass.get(i));}}}}catch(ClassNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}第27頁您的設(shè)計模式}returnreturnClassList;}//從一個包中查找出所有的類,在jar包中不能查找privatestaticList<Class>您的設(shè)計模式}returnreturnClassList;}//從一個包中查找出所有的類,在jar包中不能查找privatestaticList<Class>getClasses(StringpackageName)throwsClassNotFoundException,IOException{ClassLoaderclassLoader=Th.currentTh ().getContextClassLoader();Stringpath=packageName.replace('.','/');Enumeration<URL>resources=classLoader.getResources(path);List<File>dirs=newArrayList<File>();while(resources.hasMoreElements()){URLresource=resources.nextElement();dirs.add(newFile(resource.getFile()));}ArrayList<Class>classes=newArrayList<Class>();for(Filedirectory:dirs){classes.addAll(findClasses(directory,packageName));}returnclasses;}privatestaticList<Class>findClasses(Filedirectory,StringthrowsClassNotFoundException{List<Class>classes=newArrayList<Class>();if(!directory.exists()){returnclasses;}File[]files=directory.listFiles();for(Filefile:files){if(file.isDirectory()){assert!file.getName().contains(".");classes.addAll(findClasses(file,packageName+"."+file.getName()));}elseif(file.getName().endsWith(".class")){classes.add(Class.forName(packageName+'.'+file.getName().substring(0,file.getName().length()-6)));}}returnclasses;}packageName)第28頁您的設(shè)計模式}以由父類查找到所有的子類,這個要修改一下,動腦筋想下,簡單的很!完整的類圖如下:Human了算,簡單工廠模式就是這么簡單,那我們再引入一個問題:人是有的呀,有男有女,你這怎么沒區(qū)別,別急,這個且聽下回分解!工廠模式還有一個非常重要的應(yīng)用,就是延遲始化(Lazyinitialization),什么是延遲始化呢?一個對象初始化完畢后就不,等到再次用到得就不用再次初始化了,直接從內(nèi)存過中拿到就可以了,怎么實現(xiàn)呢,很簡單,看例子:packagecom.cbf4life.advance;import您的設(shè)計模式}以由父類查找到所有的子類,這個要修改一下,動腦筋想下,簡單的很!完整的類圖如下:Human了算,簡單工廠模式就是這么簡單,那我們再引入一個問題:人是有的呀,有男有女,你這怎么沒區(qū)別,別急,這個且聽下回分解!工廠模式還有一個非常重要的應(yīng)用,就是延遲始化(Lazyinitialization),什么是延遲始化呢?一個對象初始化完畢后就不,等到再次用到得就不用再次初始化了,直接從內(nèi)存過中拿到就可以了,怎么實現(xiàn)呢,很簡單,看例子:packagecom.cbf4life.advance;importjava.util.HashMap;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/@SuppressWarnings("all")publicclassHumanFactory{//定義一個MAP,初始化過的Human對象都放在這里第29頁您的設(shè)計模式privatestaticHashMap<String,Human>humans=newHashMap<String,Human>();//定一個烤箱,泥巴塞進去,人就出來,這個太先進了publicstaticHumancreateHuman(Classc){您的設(shè)計模式privatestaticHashMap<String,Human>humans=newHashMap<String,Human>();//定一個烤箱,泥巴塞進去,人就出來,這個太先進了publicstaticHumancreateHuman(Classc){;//定義一個類型的人類try{//如果MAP中有,則直接從取出,不用初始化了if(humans.containsKey(c.getSimpleName())){ human=humans.get(c.getSimpleName()); }else{ human=(Human)Class.forName(c.getName()).newInstance(); //放到MAP中 humans.put(c.getSimpleName(),human);}ationExceptione){//你要是不說個人種顏色的話,沒法烤,要白的}catch(Inst黑,你說話了烤System.out.println("必須指定人種的顏色");}catch(IllegalAccessExceptione){//一定定義的人種有問題,那就烤不出來了,這是...System.out.println("人種定義錯誤!");e//你隨便說個人種,我到哪里給你去?!System.out.println("混蛋,你指定的人種找不到!");}returnhuman;}}很簡單,就加上了黃色那部分的代碼,這個在類初始化很消耗資源的情況比較實用,比如你要連接硬減少項目的復(fù)雜程度。第30頁您的設(shè)計模式6章好了,我們繼一節(jié)課,講到女媧造人,人是造出來了,世界時熱鬧了,低頭一看,都是清的類型,缺少關(guān)愛、、喜怒哀樂等情緒,人類的生命太平淡了,女媧,猛然一拍腦袋,Shit!忘記給人類定義了,那怎么辦?抹掉重來,然后就把人類重新洗牌,準(zhǔn)備重新開始 人類。怎么改吧,好,有了,給每個人類都加一個,然后再重新,這個問題解決了,那八卦爐怎么辦?只有一個呀,要么生產(chǎn)出全性,要不都是女性,那不行呀,有了,把已經(jīng)有了一條生產(chǎn)線——八卦Factory)拆開,個,并且略加修改,就成了女性八卦爐(只生產(chǎn)女性,一個具體工廠的實現(xiàn)類)和男性八卦爐(只生產(chǎn)男性,又一個具體工廠的實現(xiàn)類先看人類(也就是)的類圖:其中三個抽象類在抽象工廠模式中是叫做等級,六個實現(xiàn)類是叫做族,這個也比較好理解,實現(xiàn)類嘛是真實的,一個叫,多了就叫族,然后再看工廠類:第31頁您的設(shè)計模式6章好了,我們繼一節(jié)課,講到女媧造人,人是造出來了,世界時熱鬧了,低頭一看,都是清的類型,缺少關(guān)愛、、喜怒哀樂等情緒,人類的生命太平淡了,女媧,猛然一拍腦袋,Shit!忘記給人類定義了,那怎么辦?抹掉重來,然后就把人類重新洗牌,準(zhǔn)備重新開始 人類。怎么改吧,好,有了,給每個人類都加一個,然后再重新,這個問題解決了,那八卦爐怎么辦?只有一個呀,要么生產(chǎn)出全性,要不都是女性,那不行呀,有了,把已經(jīng)有了一條生產(chǎn)線——八卦Factory)拆開,個,并且略加修改,就成了女性八卦爐(只生產(chǎn)女性,一個具體工廠的實現(xiàn)類)和男性八卦爐(只生產(chǎn)男性,又一個具體工廠的實現(xiàn)類先看人類(也就是)的類圖:其中三個抽象類在抽象工廠模式中是叫做等級,六個實現(xiàn)類是叫做族,這個也比較好理解,實現(xiàn)類嘛是真實的,一個叫,多了就叫族,然后再看工廠類:第31頁您的設(shè)計模式createHuman,目的是簡化實現(xiàn)類的代碼工作量,這個在講代碼的時候會說。這里還使用了Jdk1.5的一個新特性Enum類型,其實這個完全可以類的靜態(tài)變量來實現(xiàn),但我的知識點吧,我希望給大家講解,每次的提出來,每個人都會有一點的收獲就足夠了,然后在具體的項目中使用時,知道有這個baidu續(xù)類圖,完整的類圖如下,這個看不大清楚,其實就是上面那兩個類圖加起來,大家可以看源碼中的那個您的設(shè)計模式createHuman,目的是簡化實現(xiàn)類的代碼工作量,這個在講代碼的時候會說。這里還使用了Jdk1.5的一個新特性Enum類型,其實這個完全可以類的靜態(tài)變量來實現(xiàn),但我的知識點吧,我希望給大家講解,每次的提出來,每個人都會有一點的收獲就足夠了,然后在具體的項目中使用時,知道有這個baidu續(xù)類圖,完整的類圖如下,這個看不大清楚,其實就是上面那兩個類圖加起來,大家可以看源碼中的那個類圖文件:然后類圖講解完畢,我們來看程序?qū)崿F(xiàn):第32頁您的設(shè)計模式packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.定義一個人類的統(tǒng)稱,問題出來了,剛剛定義的時候忘記定義 了*這個重要的問題非修改不可,否則*/publicinterface您的設(shè)計模式packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.定義一個人類的統(tǒng)稱,問題出來了,剛剛定義的時候忘記定義 了*這個重要的問題非修改不可,否則*/publicinterfaceHuman{//首先定義什么是人類上太多太多的東西不了//人是愉快的,會笑的,本來是想用spublicvoidlaugh();laugh更合適,好長時間沒有大笑了;//人類還會哭,代表痛苦publicvoidcry();//人類會說話publicvoidtalk();//定義publicvoidsex();}crytalk()三個,以AbstractYellowHuman為例:packagecom.cbf4life.yellowHuman;importcom.cbf4life.Human;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*為什么要修改成抽象類呢?要定義*/呀publicabstractclassAbstractYellowHumanimplementsHuman{publicvoidcry(){黃色人種會哭");}第33頁您的設(shè)計模式publicvoidlaugh(){黃色人種會大笑,}呀!");publicvoidtalk(){System.out.println("黃色人種會說話,說的字節(jié)"您的設(shè)計模式publicvoidlaugh(){黃色人種會大笑,}呀!");publicvoidtalk(){System.out.println("黃色人種會說話,說的字節(jié)");}}代碼,大家可以看一下源代碼。算了,還是拷貝,反正是 Eclipse白種人的抽象類:packagecom.cbf4life.whiteHuman;importcom.cbf4life.Human;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.白色人人種*/publicabstractclassAbstractWhiteHumanimplementsHuman{publicvoidcry(){System.out.println("白色人種會哭");}publicvoidlaugh(){System.out.println("白色人種會大笑,侵略的笑聲");}第34頁您的設(shè)計模式publicvoidtalk(){System.out.println("白色人種會說話,都是但是單字節(jié)!");}}黑種人的抽象類:packagecom.cbf4life.blackHuman;importcom.cbf4life.Human;/**@authorcbf4Lifecbf4life@126.comI'mgladtoshare您的設(shè)計模式publicvoidtalk(){System.out.println("白色人種會說話,都是但是單字節(jié)!");}}黑種人的抽象類:packagecom.cbf4life.blackHuman;importcom.cbf4life.Human;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.人的意思,不懂,沒跟老外說話*黑色人種,記得*/英語,說blackman是publicabstractclassAbstractBlackHumanimplementsHuman{publicvoidcry(){}");publicvoidlaugh(){}");publicvoidtalk(){System.out.println("可以說話,人聽不懂");}}三個抽象類都實現(xiàn)完畢了,然后就是些實現(xiàn)類了。其實,你說抽象類放這里有什么意義嗎?就是不允new女性黃種人的實現(xiàn)類:packagecom.cbf4life.yellowHuman;第35頁您的設(shè)計模式/**@authorcbf4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論