==創(chuàng)建型模式==
1、 =SIMPLE FACTORY=
打完籃球真累,正好邊上有個(gè)小攤。
“來杯可樂。”
“我要芬達(dá)。”
“一瓶礦泉水。”
工廠模式:客戶類和工廠類分開。消費(fèi)者任何時(shí)候需要某種產(chǎn)品,只需向工廠請(qǐng)求即可。消費(fèi)者無須修改就可以接納新產(chǎn)品。有了小攤這個(gè)工廠,我們口渴的問題就很easy的解決了。
2、 =FACTORY METHOD=
以前每次下午打完籃球后一般很晚,回來再洗個(gè)澡,食堂就關(guān)門了。我們就集體跑過西三門外吃牛肉面(呵呵,人生之一大爽事啊),每個(gè)餐廳的風(fēng)味還不一樣,這無所謂啦,我們只要說一句“來碗牛肉面“就行了。
工廠方法模式:核心工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類去做,成為一個(gè)抽象工廠角色,僅負(fù)責(zé)給出具體工廠類必須實(shí)現(xiàn)的接口,而不接觸哪一個(gè)產(chǎn)品類應(yīng)當(dāng)被實(shí)例化這種細(xì)節(jié)。每一個(gè)餐廳就是一個(gè)具體的工廠,可惜現(xiàn)在西三門已經(jīng)關(guān)掉了,郁悶ing!
3、 =SINGLETON=
Kobe就是Kobe,不管你是從電視上看到,還是從報(bào)紙上看到,其實(shí)就是他一個(gè)人
單例模式:單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例單例模式。組織后衛(wèi)可以有幾個(gè),但Kobe只能有一個(gè),廢話!
4、 =BUILDER=
NBA中強(qiáng)隊(duì)頗多,且各有自己的特點(diǎn),因此對(duì)付不同的隊(duì)有不同的打法,但你只要說“今天打國王”就行了,具體該怎么打由教練去安排(build)就行了。
建造模式:將產(chǎn)品的內(nèi)部表象和客戶端分來,客戶不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),因此當(dāng)產(chǎn)品的表象一般很復(fù)雜時(shí)才用。戰(zhàn)術(shù)安排的確是個(gè)比較專業(yè)的任務(wù),所以…。
5、 =PROTOTYPE=
今年全明星賽真不錯(cuò),真想再看一遍。
“小陳,把serv-u開一下,我下你的全明星賽。”
“OK!不過先上傳兩部好片。”
“啊,我暈~~!”
原始模型模式:實(shí)際上就是復(fù)制啦。原始模型模式允許動(dòng)態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類適合于任何的等級(jí)結(jié)構(gòu)。缺點(diǎn)是每一個(gè)類都必須配備一個(gè)克隆方法。還好,Windows里面的東東只要點(diǎn)右鍵,都有個(gè)復(fù)制選項(xiàng)。
==結(jié)構(gòu)型模式==
6、 =ADAPTER=
姚明剛?cè)セ鸺龝r(shí),交流有點(diǎn)不便,但通過經(jīng)紀(jì)人Adapter,姚明很快就和火箭的其他人混熟了。
適配器模式:把一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一起工作的兩個(gè)類能夠一起工作。通過經(jīng)紀(jì)人Adapter,主教練就可以把姚明看作本土人(會(huì)說e文的人)。如今姚明已經(jīng)加強(qiáng)了功能,使得不要經(jīng)紀(jì)人也可以和主教練交流,呵呵,str man!
7、 =COMPOSITE=
上半場被灌了個(gè)50:25,趁中場暫停,大家一起來安排下半場怎么打:
“方案A:6號(hào)太準(zhǔn),要專人盯防。”―“就是就是!”
“方案B:左邊防守太弱,把XX換上來。”-“好耶好耶!”
“方案C:進(jìn)攻太差,多打一些擋差。”-“不錯(cuò)不錯(cuò)!”
“方案D:上半場方案X其實(shí)還是不錯(cuò)的,下半場go on。”-“OKOK!“
…
一聲哨響,下半場開始,我們把方案A,B,C…結(jié)合,定為方案Y。@#¥%^&*(!~等一系列后,我們終于以51:50戰(zhàn)勝對(duì)手,哈哈…!!白日夢#&@*!
合成模式:合成模式使得客戶端把單獨(dú)的成分對(duì)象和由他們復(fù)合而成的合成對(duì)象同等看待,因此合成模式使得客戶端增加新的構(gòu)件變得容易。方案A是一條簡單的方案,方案D是由不同的方案結(jié)合而成的復(fù)雜方案,但我們不管這些,我們只知道它們都是我們所要的方案。
8、 =DECORATOR=
記得西邊操場沒修好時(shí),我們踢球沒有地盤,還好,有個(gè)籃球場是空的,我們便撿來幾塊磚頭,擺上兩個(gè)門,哈哈,這樣,籃球場也就變成小足球場了。
系里舉辦一個(gè)舞會(huì),得找塊大點(diǎn)的地盤,我們又看中了籃球場,掛起一盞燈,搬來兩個(gè)音箱,ok,一切搞定。這樣,籃球場便變成了舞會(huì)廳了,哈哈。
裝飾模式:裝飾模式以對(duì)客戶端透明的方式擴(kuò)展對(duì)象的功能,是繼承關(guān)系的一個(gè)替代方案,提供比繼承更多的靈活性。其實(shí),籃球場還可以變成很多其它的東東,只要發(fā)揮你的想像,嘻嘻。
9、 =PROXY=
玩NBA正happying。
突然,小付跑過來說:“你的電話,X系說明天下午兩點(diǎn)要跟俺們系干一場,怎么樣?”
-“OK,就跟他們說沒問題!”玩Games要緊。
小付作為一個(gè)代理倒省了俺不少事,呵呵。
代理模式:代理就是一個(gè)人或一個(gè)機(jī)構(gòu)代表另一個(gè)人或者一個(gè)機(jī)構(gòu)采取行動(dòng)。某些情況下,客戶不想或者不能夠直接引用一個(gè)對(duì)象,代理對(duì)象可以在客戶和目標(biāo)對(duì)象直接起到中介的作用。客戶端分辨不出代理主題對(duì)象與真實(shí)主題對(duì)象。代理模式可以并不知道真正的被代理對(duì)象,而僅僅持有一個(gè)被代理對(duì)象的接口,這時(shí)候代理對(duì)象不能夠創(chuàng)建被代理對(duì)象,被代理對(duì)象必須有系統(tǒng)的其他角色代為創(chuàng)建并傳入。X系只知道我們同意和他們干一場,但并不知道是回答他們的就是小付。
10、 =FLYWEIGHT=
上次說到吃牛肉面,我們當(dāng)中有幾個(gè)還特挑剔。這不:
“老板,我要麻辣的。”-“好咧!”唰唰,老板放了些辣醬。
“我要川味的。”-“好咧!”唰唰,老板放了些泡菜。
“我也要川味的。”-老板按剛才的樣式又做了一遍。
小陳一看大家都要,不服,就說:“老板,俺要黑的。”
“黑的?黑的是什么樣的。”老板納悶了。
“黑的,黑的就是多放些醬油…”-全場狂暈#&*%
享元模式:享元模式以共享的方式高效的支持大量的細(xì)粒度對(duì)象。享元模式能做到共享的關(guān)鍵是其狀態(tài)存儲(chǔ)在享元內(nèi)部,不會(huì)隨環(huán)境的改變而有所不同。將可以共享的狀態(tài)和不可以共享的狀態(tài)從常規(guī)類中區(qū)分開來,把不可以共享的狀態(tài)從類里剔除出去。客戶端從工廠中獲得對(duì)象時(shí),工廠會(huì)先檢查其是否有該對(duì)象,如果有則直接返回給客戶,沒有才創(chuàng)建新的實(shí)例。享元模式大幅度的降低內(nèi)存中對(duì)象的數(shù)量。那些麻辣啦,川味啦,都是享元,要的牛肉面有很多,但口味卻就那么幾種。后來,我們打玩籃球又去了那家店,還沒等過小陳開口,老板就說:“這位同學(xué),你是要黑牛肉面吧。”-小陳“……”
11、=FACADE=
又要和X系開始一季一度的比賽了,具體時(shí)間和地點(diǎn)還得靠俺這個(gè)隊(duì)長來搞定,好,no problem!給X系籃球隊(duì)隊(duì)長一個(gè)call:“星期六下午3:00,我們一見高下。”
門面模式:門面模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用,它將客戶端和一些子系統(tǒng)分離,提高子系統(tǒng)的獨(dú)立性和可移植性。X系籃球隊(duì)隊(duì)長就是個(gè)Facade,通過他,免得我要去跟他們系隊(duì)員(子系統(tǒng))一個(gè)個(gè)去通知。
12、=BRIDGE=
我是個(gè)學(xué)生,但在籃球隊(duì)里,我又是個(gè)隊(duì)員,那你說我是什么,超級(jí)賽亞人?呵呵。
橋梁模式:將抽象化與實(shí)現(xiàn)化脫耦,使得二者可以獨(dú)立的變化,也就是說將他們之間的強(qiáng)關(guān)聯(lián)變成弱關(guān)聯(lián),也就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以獨(dú)立的變化。哈哈,多虧這個(gè)模式,不然我還真不知道該怎么稱呼我自己呢,嘻嘻。
==行為模式==
13、=STRATEGY=
足球里有很多戰(zhàn)術(shù),比如,一般情況用442,打強(qiáng)隊(duì)可以用451,打弱隊(duì)可以用343。
當(dāng)然籃球里面也有的,比如,你可以選擇打中鋒,或者遠(yuǎn)投,當(dāng)然我們平時(shí)最多用的可能就是獨(dú)干,哈哈。
策略模式:策略模式針對(duì)一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。策略模式把行為和環(huán)境分開。環(huán)境類負(fù)責(zé)維持和查詢行為類,各種算法在具體的策略類中提供。由于算法和環(huán)境獨(dú)立開來,算法的增減,修改都不會(huì)影響到環(huán)境和客戶端。
14、=TEMPLATE METHOD=
不同的籃球班有不同的老師,但他們上課的內(nèi)容都是一樣的,一般都分為運(yùn)球,傳球,投籃,上籃這么幾堂課,估計(jì)體育師范學(xué)院教書的模版就是這樣。具體運(yùn)球怎么教,上籃怎么教就依不同的老師自己了。
模板方法模式:模板方法模準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實(shí)現(xiàn),然后聲明一些抽象方法來迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。先制定一個(gè)頂級(jí)邏輯框架,而將邏輯的細(xì)節(jié)留給具體的子類去實(shí)現(xiàn)。
15、=OBSERVER=
“今天下午去打籃球啊。”-A
“好啊,到時(shí)叫上我。” -B
“也叫上我。” -C
“還有我。”-D
…
我們班的號(hào)召力可見一斑,呵呵。
觀察者模式:觀察者模式使觀察者和被觀察者之間的耦合抽象化,被觀察者會(huì)向所有的登記過的觀察者發(fā)出通知。當(dāng)A要去打籃球時(shí),便會(huì)通知B,C,D…
16、=ITERATOR=
大一時(shí)上籃球課,體育老師要清名單:“小王(體育委員),你們班到了多少人?”
小王:“立正--,報(bào)數(shù)。”
“1,2,3,4,…”
迭代子模式:迭代子模式可以順序訪問一個(gè)聚集中的元素而不必暴露聚集的內(nèi)部表象。迭代子模式將迭代邏輯封裝到一個(gè)獨(dú)立的子對(duì)象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。每一個(gè)聚集對(duì)象都可以有一個(gè)或一個(gè)以上的迭代子對(duì)象,每一個(gè)迭代子的迭代狀態(tài)可以是彼此獨(dú)立的。迭代算法可以獨(dú)立于聚集角色變化。小王真聰明,不必查詢?nèi)魏我粋€(gè)人就知道到了多少人。
17、=CHAIN OF RESPONSIBLEITY=
現(xiàn)在湖人隊(duì)進(jìn)攻,佩頓將球交給馬龍,馬龍?jiān)賯鹘o奧尼爾,奧尼爾一記重扣,湖人再添2分。
責(zé)任鏈模式:在責(zé)任鏈模式中,很多對(duì)象由每一個(gè)對(duì)象對(duì)其下家的引用連接起來而形成一條鏈。請(qǐng)求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)對(duì)象決定處理此請(qǐng)求。客戶并不知道鏈上的哪一個(gè)對(duì)象最終處理這個(gè)請(qǐng)求,系統(tǒng)可以在不影響客戶端的情況下動(dòng)態(tài)的重新組織鏈和分配責(zé)任。處理者有兩個(gè)選擇:承擔(dān)責(zé)任或者把責(zé)任推給下家。一個(gè)請(qǐng)求可以最終不被任何接收端對(duì)象所接受。其實(shí)剛才那個(gè)球,奧尼爾可以再傳給科比來個(gè)空中接力大風(fēng)車灌籃的,那就PERFECT了!
18、=COMMAND=
一場關(guān)鍵比賽最后一秒由俺的三分決定了勝負(fù),不過,可累壞了俺。
“來杯水。”真聽話,我同學(xué)A馬上叫一靚MM給我倒了杯水。
“背好酸。”真聽話,我同學(xué)A馬上又叫那個(gè)靚MM給我錘背。
“真想洗個(gè)澡。”真聽話…“等等,我不是那個(gè)意思,哇哇…^¥&#*。”
命令模式:命令模式把一個(gè)請(qǐng)求或者操作封裝到一個(gè)對(duì)象中。命令模式把發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開,委派給不同的對(duì)象。命令模式允許請(qǐng)求的一方和發(fā)送的一方獨(dú)立開來,使得請(qǐng)求的一方不必知道接收請(qǐng)求的一方的接口,更不必知道請(qǐng)求是怎么被接收,以及操作是否執(zhí)行,何時(shí)被執(zhí)行以及是怎么被執(zhí)行的。如果早知道那個(gè)命令怎么執(zhí)行,俺就不會(huì)說那句話了,嗚嗚…
19、=MEMENTO=
下了一個(gè)NBA小游戲,里面可以自動(dòng)調(diào)關(guān),但要改注冊表,當(dāng)然,先找到鍵值“總決賽”,右鍵,導(dǎo)出為final.reg,剩下來你就可以隨便改了,萬一改錯(cuò)了,還可以雙擊final.reg,呵呵。
備忘錄模式:備忘錄對(duì)象是一個(gè)用來存儲(chǔ)另外一個(gè)對(duì)象內(nèi)部狀態(tài)的快照的對(duì)象。備忘錄模式的用意是在不破壞封裝的條件下,將一個(gè)對(duì)象的狀態(tài)捉住,并與該對(duì)象分離,存儲(chǔ)起來,從而可以在將來合適的時(shí)候把這個(gè)對(duì)象還原到存儲(chǔ)起來的狀態(tài)。
20、STATE
今天打球真沒勁,投籃老委掉。
忽然,一靚MM走過來… 啊--,超級(jí)賽亞人第三階,變身!
變身之后果然不同凡響,輕松幌過兩個(gè)人,在三個(gè)人的夾擊下出手命中,同時(shí)加罰!(呵呵,就會(huì)吹)
狀態(tài)模式:狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變行為。這個(gè)對(duì)象看上去像是改變了它的類一樣。狀態(tài)模式需要對(duì)每一個(gè)系統(tǒng)可能取得的狀態(tài)創(chuàng)立一個(gè)狀態(tài)類的子類。當(dāng)系統(tǒng)的狀態(tài)變化時(shí),系統(tǒng)實(shí)際改變所選的子類。當(dāng)一個(gè)對(duì)象行為依賴其所處狀態(tài)時(shí),就可以考慮用該模式。靚MM沒來時(shí),狀態(tài)差,導(dǎo)致投籃委。靚MM一來,狀態(tài)奇佳,就是打手也能進(jìn),哈哈。
21、=VISITOR=
下學(xué)期籃球課換了個(gè)老師,當(dāng)然,他對(duì)我們?nèi)徊皇欤谑堑谝还?jié)課他拿著花名冊找到體育委員小王:“小陳技術(shù)怎樣?”-“一般般,”
“小羅呢?”-“還可以,不過上籃不行。”
“小何呢?”-“他啊…”
等等,俺趕緊咳嗽一聲。
“他怎么樣?”-“他,他不錯(cuò)不錯(cuò)!” 哈哈。
“就是投籃老委!”-啊,你這小樣,耍我。
訪問者模式:訪問者模式的目的是封裝一些施加于某種數(shù)據(jù)結(jié)構(gòu)元素之上的操作,使得增加新的操作很容易,一旦這些操作需要修改的話,接受這個(gè)操作的數(shù)據(jù)結(jié)構(gòu)可以保持不變,比如,老師還可以通過小王得到我們每個(gè)人的身高等。訪問者模式可以跨過幾個(gè)類的等級(jí)結(jié)構(gòu)訪問屬于不同的等級(jí)結(jié)構(gòu)的成員類(比迭代子強(qiáng)),但增加一個(gè)新的節(jié)點(diǎn)就變得很困難,如果我們班來了個(gè)新同學(xué),小王就沒那么管用了。
22、=INTERPRETER=
想知道怎么玩出酷呆了的假動(dòng)作么,我這兒有AND1的經(jīng)典集錦,按照上面練習(xí)就行了。
解釋器模式:給定一個(gè)語言后,解釋器模式可以定義出其文法的一種表示,并同時(shí)提供一個(gè)解釋器。客戶端可以使用這個(gè)解釋器來解釋這個(gè)語言中的句子。解釋器模式將描述怎樣在有了一個(gè)簡單的文法后,使用模式設(shè)計(jì)解釋這些語句。在解釋器模式里面提到的語言是指任何解釋器對(duì)象能夠解釋的任何組合。在解釋器模式中需要定義一個(gè)代表文法的命令類的等級(jí)結(jié)構(gòu),也就是一系列的組合規(guī)則。每一個(gè)命令對(duì)象都有一個(gè)解釋方法,代表對(duì)命令對(duì)象的解釋。命令對(duì)象的等級(jí)結(jié)構(gòu)中的對(duì)象的任何排列組合都是一個(gè)語言。
23、=MEDIATOR=
俺一高中同學(xué)小D到我這兒來玩,當(dāng)然,打球是必不可少的。叫上小王就出去K別人,但小D和小王不熟,所以幾乎沒什么配合,結(jié)果被CAI了個(gè)5:0。只好下場“休息”。
小王:“叫你那個(gè)同學(xué)少單干,多傳球。”-“OK。”我過去把意見傳給了小D。
小D:“你那個(gè)同學(xué)防守有問題,要盯人,不要盯球。”-“NO PROBLEM。”我又過去把意見傳給了小王。
調(diào)停者模式:調(diào)停者模式包裝了一系列對(duì)象相互作用的方式,使得這些對(duì)象不必相互明顯作用。從而使他們可以松散偶合。當(dāng)某些對(duì)象之間的作用發(fā)生改變時(shí),不會(huì)立即影響其他的一些對(duì)象之間的作用。保證這些作用可以彼此獨(dú)立的變化。調(diào)停者模式將多對(duì)多的相互作用轉(zhuǎn)化為一對(duì)多的相互作用。調(diào)停者模式將對(duì)象的行為和協(xié)作抽象化,把對(duì)象在小尺度的行為上與其他對(duì)象的相互作用分開處理。
果然,依靠我這個(gè)MEDIATOR,我們馬上還了對(duì)方一個(gè)雞蛋。哈哈!