設(shè)計(jì)模式優(yōu)缺點(diǎn)及應(yīng)用場(chǎng)景整理_第1頁
設(shè)計(jì)模式優(yōu)缺點(diǎn)及應(yīng)用場(chǎng)景整理_第2頁
設(shè)計(jì)模式優(yōu)缺點(diǎn)及應(yīng)用場(chǎng)景整理_第3頁
設(shè)計(jì)模式優(yōu)缺點(diǎn)及應(yīng)用場(chǎng)景整理_第4頁
設(shè)計(jì)模式優(yōu)缺點(diǎn)及應(yīng)用場(chǎng)景整理_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上看完發(fā)現(xiàn)有不太對(duì)的地方告訴我下各設(shè)計(jì)模式優(yōu)缺點(diǎn)總結(jié)1橋接模式優(yōu)點(diǎn):1 將實(shí)現(xiàn)予以解耦,讓它和界面之間不再永久綁定 2 抽象和實(shí)現(xiàn)可以獨(dú)立擴(kuò)展,不會(huì)影響到對(duì)方 3 對(duì)于“具體的抽象類”所做的改變,不會(huì)影響到客戶。缺點(diǎn):1. 增加了復(fù)雜度 用途:1. 適合使用在需要跨越多個(gè)平臺(tái)的圖形和窗口上 2. 當(dāng)需要用不同的方式改變接口和實(shí)現(xiàn)時(shí),你會(huì)發(fā)現(xiàn)橋接模式很好用。具體實(shí)例:跨平臺(tái)的軟件,不同電視機(jī)和不同的遙控器。2生成器模式(建造者模式)優(yōu)點(diǎn):1. 將一個(gè)復(fù)雜對(duì)象的創(chuàng)建過程封裝起來2. 允許對(duì)象通過多個(gè)步驟來創(chuàng)建,并且可以改變創(chuàng)建過程3. 向客戶隱藏內(nèi)部的表現(xiàn)4. 產(chǎn)品的實(shí)現(xiàn)可

2、以被替換,因?yàn)榭蛻糁豢吹揭粋€(gè)抽象的接口缺點(diǎn):1. 與工廠模式相比,采用生成器模式創(chuàng)建對(duì)象更復(fù)雜,其客戶,需要更多的知識(shí)領(lǐng)域。用處:用來創(chuàng)建組合結(jié)構(gòu)。典型例子:想不起典型例子還是扯那個(gè)畫小人,構(gòu)建小人分畫頭,畫身體,畫雙手,黃雙腳等不同構(gòu)建部分,全部放在一起構(gòu)建。3職責(zé)鏈模式優(yōu)點(diǎn):1. 將請(qǐng)求的發(fā)送者和接收者解耦2. 可以簡(jiǎn)化你的對(duì)象,因?yàn)樗恍枰梨湹慕Y(jié)構(gòu)3. 通過改變鏈內(nèi)的成員或調(diào)動(dòng)他們的次序,允許你動(dòng)態(tài)地新增或刪除責(zé)任缺點(diǎn):1. 并不保證請(qǐng)求一定會(huì)被執(zhí)行,如果沒有任何對(duì)象處理它的話,它可能會(huì)落到鏈尾端之外2. 可能不容觀察運(yùn)行時(shí)的特征,有礙于除錯(cuò)。用途:經(jīng)常被使用在窗口系統(tǒng)中,處理鼠標(biāo)和

3、鍵盤之類的事件。當(dāng)算法牽涉到一種鏈型運(yùn)算,而且不希望處理過程中有過多的循環(huán)和條件選擇語句,并且希望比較容易的擴(kuò)充文法,可以采用職責(zé)鏈模式。1)有多個(gè)對(duì)象處理請(qǐng)求,到底怎么處理在運(yùn)行時(shí)確定。2)希望在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交請(qǐng)求。3)可處理一個(gè)請(qǐng)求的對(duì)象集合應(yīng)該被動(dòng)態(tài)指定。典型例子:一個(gè)請(qǐng)求發(fā)送給前臺(tái),前臺(tái)表示我無權(quán)管理,將請(qǐng)求傳遞給財(cái)務(wù)部門,財(cái)務(wù)部門再4蠅量模式(享元)優(yōu)點(diǎn):1. 減少運(yùn)行時(shí)對(duì)象實(shí)例的個(gè)數(shù),節(jié)省內(nèi)存2. 將許多“虛擬”對(duì)象的狀態(tài)集中管理缺點(diǎn):一旦你實(shí)現(xiàn)了它,單個(gè)的邏輯實(shí)現(xiàn)將無法擁有獨(dú)立而不同的行為用途:當(dāng)一個(gè)類有許多的實(shí)例,而這些實(shí)例能被同一方法控制的時(shí)

4、候,我們就可以使用蠅量模式。(這話什么意思啊,HF書上原話,是這話有問題還是我理解能力有問題?!)具體場(chǎng)景:五子棋中的黑白子,改變坐標(biāo)狀態(tài)(x,y),但用同一個(gè)實(shí)體。5解釋器模式(這個(gè)模式我真沒仔細(xì)看)優(yōu)點(diǎn):1 將每一個(gè)語法規(guī)則表示成一個(gè)類,方便事先語言。2 因?yàn)檎Z法由許多類表示,所以你可以輕易地改變或擴(kuò)展此語言3 通過在類結(jié)構(gòu)中加入新的方法,可以在解釋的同時(shí)增加新的行為,例如打印格式的梅花或者進(jìn)行復(fù)制的程序驗(yàn)證。缺點(diǎn):當(dāng)語法規(guī)則數(shù)目太大時(shí),這個(gè)模式可能會(huì)變得非常繁瑣。用途:1 當(dāng)你需要實(shí)現(xiàn)一個(gè)簡(jiǎn)答的語言時(shí),使用解釋器2 當(dāng)你有一個(gè)簡(jiǎn)單的語法,切簡(jiǎn)單比效率更重要時(shí),使用解釋器3 可以處理腳本語

5、言和編程語言典型例子:正則表達(dá)式6中介者模式優(yōu)點(diǎn):1. 通過將對(duì)象彼此解耦,可以增加對(duì)象的復(fù)用性。2. 通過將控制邏輯集中,可以簡(jiǎn)化系統(tǒng)維護(hù)3. 可以讓對(duì)象之間傳遞的消息變得簡(jiǎn)單而且大幅減少缺點(diǎn):1. 如果設(shè)計(jì)不當(dāng),中介者對(duì)象本身會(huì)變得過于復(fù)雜用途:常常被用來協(xié)調(diào)相關(guān)的GUI組件(HF設(shè)計(jì)模式上的原話,這書附錄A部分真的有點(diǎn)敷衍)經(jīng)典例子:我租房,但沒有戶主信息,我和戶主不能直接交替。沒關(guān)系,中介者類有我和戶主的信息,private我,private戶主。而我和戶主都認(rèn)識(shí)中介者。我將信息傳遞給中介者,在我中調(diào)用中介者.獲取信息()方法,中介者獲取信息后,再由中介者傳遞給戶主。7備忘錄模式優(yōu)點(diǎn):

6、1. 將被存儲(chǔ)的狀態(tài)放在外面,不要和關(guān)鍵對(duì)象混在一起,可以幫助維護(hù)內(nèi)聚2. 保持關(guān)鍵對(duì)象的數(shù)據(jù)封裝3. 提供了容易實(shí)現(xiàn)的恢復(fù)能力缺點(diǎn):1. 儲(chǔ)存和恢復(fù)狀態(tài)的過程可能相當(dāng)耗時(shí)用途備忘錄模式用于存儲(chǔ)狀態(tài),在java中可以使用序列化。經(jīng)典例子:游戲中途保存游戲,這時(shí)候可以調(diào)用保存當(dāng)前狀態(tài)方法,再讀取的時(shí)候調(diào)用讀取。Java序列化機(jī)制在這方面非常的方便。8原型模式優(yōu)點(diǎn):1. 向客戶隱藏制造新實(shí)例的復(fù)雜性2. 提供讓客戶能夠產(chǎn)生未知類型對(duì)象的選項(xiàng)3. 在某些環(huán)境下,復(fù)制對(duì)象比新建對(duì)象更有效缺點(diǎn):復(fù)制對(duì)象有時(shí)相當(dāng)復(fù)雜用途:在一個(gè)復(fù)制的類層次中,當(dāng)系統(tǒng)必須從其中的許多類型創(chuàng)建新對(duì)象時(shí),可以考慮原型模式。經(jīng)典

7、例子:隨便拿一個(gè)類,給這個(gè)類寫一個(gè)克隆方法,復(fù)制當(dāng)前對(duì)象?;蛘咧苯佑梅葱蛄谢?。9訪問者模式優(yōu)點(diǎn):1. 允許你對(duì)組合結(jié)構(gòu)加入新的操作,無需改變結(jié)構(gòu)本身2. 想要加入新的操作相對(duì)容易3. 訪問者所進(jìn)行的操作,其代碼是集中在一起的缺點(diǎn):1. 會(huì)打破組合類的封裝2. 因?yàn)橛巫叩墓δ軤可嫫渲?,隨意對(duì)組合結(jié)構(gòu)的改變就更加困難。用途:有比較穩(wěn)定的數(shù)據(jù)結(jié)構(gòu),又有易于變化的算法的話,使用訪問者模式就是比較合適的,因?yàn)樵L問者模式使得算法操作的增加變得容易。經(jīng)典場(chǎng)景:特么訪問者模式和翻譯器模式,一個(gè)看不懂,一個(gè)怎么也不想看,到時(shí)候要是讓我說這兩個(gè)模式,我就自認(rèn)倒霉。10簡(jiǎn)單工廠模式優(yōu)點(diǎn):工廠類是整個(gè)模式的關(guān)鍵.包含

8、了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對(duì)象.通過使用工廠類,外界可以從直接創(chuàng)建具體產(chǎn)品對(duì)象的尷尬局面擺脫出來,僅僅需要負(fù)責(zé)“消費(fèi)”對(duì)象就可以了。而不必管這些對(duì)象究竟如何創(chuàng)建及如何組織的明確了各自的職責(zé)和權(quán)利,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。缺點(diǎn):由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個(gè)工廠類中;它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時(shí)候,可能會(huì)出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實(shí)例的需求這種對(duì)條件的判斷和對(duì)具體產(chǎn)品類型的判斷交錯(cuò)在一起,很難避免模塊功能的蔓

9、延,對(duì)系統(tǒng)的維護(hù)和擴(kuò)展非常不利;用途:工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少;客戶只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象(邏輯)不關(guān)心;由于簡(jiǎn)單工廠很容易違反高內(nèi)聚責(zé)任分配原則,因此一般只在很簡(jiǎn)單的情況下應(yīng)用。經(jīng)典例子:沒啥好說的,這不是一個(gè)真正的設(shè)計(jì)模式11策略模式優(yōu)點(diǎn):1. 提供了一種替代繼承的方法,而且保持了繼承的優(yōu)點(diǎn),比繼承更獨(dú)立(算法獨(dú)立,可以任意擴(kuò)展)2. 避免程序使用多重條件轉(zhuǎn)移語句,使系統(tǒng)更靈活,并易于擴(kuò)展3. 遵守大部分常用設(shè)計(jì)原則,高內(nèi)聚,低耦合缺點(diǎn):1. 每個(gè)具體策略類都會(huì)產(chǎn)生一個(gè)新類,所以會(huì)增加系統(tǒng)需要維護(hù)的類的數(shù)量。可以使用工廠方法來解決。用途:各個(gè)不同地區(qū)不同的納稅方法,HF

10、中不同鴨子的方法。有多種鴨子,每個(gè)鴨子都有自己的行為,fly,quaak之類的。行為有行為類,繼承同一接口實(shí)現(xiàn)不同操作,以此實(shí)現(xiàn)算法互換。12裝飾模式優(yōu)點(diǎn):1. 裝飾模式與繼承關(guān)系的目的都是要擴(kuò)展對(duì)象的功能,但是裝飾模式可以提供比繼承更多的靈活性。2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設(shè)計(jì)師可以創(chuàng)造出很多不同行為的組合。3. 有著比繼承更加靈活的特性缺點(diǎn):由于使用裝飾模式,可以比使用繼承關(guān)系需要較少數(shù)目的類。使用較少的類,當(dāng)然使設(shè)計(jì)比較易于進(jìn)行。但是,在另一方面,使用裝飾模式會(huì)產(chǎn)生比使用繼承關(guān)系更多的對(duì)象。更多的對(duì)象會(huì)使得查錯(cuò)變得困難,特別是這些對(duì)象看上去都很相像。用途:當(dāng)需

11、要給一個(gè)類添加新的行為的時(shí)候,但基于開閉原則,就使用裝飾模式。經(jīng)典例子:我穿衣服使用draw()方法,在我穿好衣服后,我還打算再寄領(lǐng)帶,而寄領(lǐng)帶就是裝飾類,我們可以把裝飾類和對(duì)象(穿衣服類)繼承于同一個(gè)接口,在裝飾類的draw()方法中調(diào)用super.draw(),然后再在這個(gè)方法里加上自己的特征。13代理模式優(yōu)點(diǎn):向客戶端隱藏了訪問某個(gè)對(duì)象的細(xì)節(jié)及復(fù)雜性;可以動(dòng)態(tài)地調(diào)用一個(gè)對(duì)象中的方法,且無需實(shí)現(xiàn)固定的接口。缺點(diǎn):(個(gè)人見解切勿當(dāng)真)總覺得代理者不夠可靠,不能得到有效的保證,要是對(duì)象代理者在維護(hù)的時(shí)候,或者其他的做出了變動(dòng),對(duì)被代理的人來說可能帶來損失。使用場(chǎng)景:1. 遠(yuǎn)程代理,可以隱藏一個(gè)

12、對(duì)象存在于不同地址空間的事實(shí)2. 虛擬代理,比如html頁面刷新的圖片,圖片一張嘴下載后才能看就是通過虛擬代理來替代了真實(shí)的圖片,此時(shí)代理存儲(chǔ)了真實(shí)圖片的路徑和尺寸3. 安全代理,用來控制真實(shí)對(duì)象的訪問權(quán)限。一般用于對(duì)象應(yīng)該有不同的訪問權(quán)限的時(shí)候4. 智能指引,當(dāng)調(diào)用真實(shí)的對(duì)象時(shí),代理處理另外一些事。經(jīng)典例子:我玩wow,但又沒有時(shí)間精力投入到里面,于是我請(qǐng)了個(gè)人來代練,代練的人和我都繼承于玩家類。而代練者是認(rèn)識(shí)我的,當(dāng)代練的人開始刷副本的時(shí)候,調(diào)用代練者.刷副本()方法,此時(shí)他在這個(gè)方法中實(shí)際調(diào)用的是我.刷副本()。14工廠方法模式優(yōu)點(diǎn):1. 良好的封裝性,代碼結(jié)構(gòu)清晰。一個(gè)對(duì)象創(chuàng)建是有條件

13、約束的,如一個(gè)調(diào)用者需要一個(gè)具體的產(chǎn)品對(duì)象,只要知道這個(gè)產(chǎn)品的類名(或約束字符串)就可以了,不用知道創(chuàng)建對(duì)象的艱辛過程,減少模塊間的耦合。2. 工廠方法模式的擴(kuò)展性非常優(yōu)秀。在增加產(chǎn)品類的情況下,只要適當(dāng)?shù)匦薷木唧w的工廠類或擴(kuò)展一個(gè)工廠類,就可以完成“擁抱變化”。例如在我們的例子中,需要增加一個(gè)棕色人種,則只需要增加一個(gè)BrownHuman類,工廠類不用任何修改就可完成系統(tǒng)擴(kuò)展。3. 屏蔽產(chǎn)品類。這一特點(diǎn)非常重要,產(chǎn)品類的實(shí)現(xiàn)如何變化,調(diào)用者都不需要關(guān)心,它只需要關(guān)心產(chǎn)品的接口,只要接口保持不表,系統(tǒng)中的上層模塊就不要發(fā)生變化,因?yàn)楫a(chǎn)品類的實(shí)例化工作是由工廠類負(fù)責(zé),一個(gè)產(chǎn)品對(duì)象具體由哪一個(gè)產(chǎn)品

14、生成是由工廠類決定的。在數(shù)據(jù)庫(kù)開發(fā)中,大家應(yīng)該能夠深刻體會(huì)到工廠方法模式的好處:如果使用JDBC連接數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)從MySql切換到Oracle,需要改動(dòng)地方就是切換一下驅(qū)動(dòng)名稱(前提條件是SQL語句是標(biāo)準(zhǔn)語句),其他的都不需要修改,這是工廠方法模式靈活性的一個(gè)直接案例。4. 工廠方法模式是典型的解耦框架。高層模塊值需要知道產(chǎn)品的抽象類,其他的實(shí)現(xiàn)類都不用關(guān)心,符合迪米特原則,我不需要的就不要去交流;也符合依賴倒轉(zhuǎn)原則,只依賴產(chǎn)品類的抽象;當(dāng)然也符合里氏替換原則,使用產(chǎn)品子類替換產(chǎn)品父類,沒問題!缺點(diǎn):待補(bǔ)充用途:第一種情況是對(duì)于某個(gè)產(chǎn)品,調(diào)用者清楚地知道應(yīng)該使用哪個(gè)具體工廠服務(wù),實(shí)例化該具體

15、工廠,生產(chǎn)出具體的產(chǎn)品來。Java Collection中的iterator() 方法即屬于這種情況。第二種情況,只是需要一種產(chǎn)品,而不想知道也不需要知道究竟是哪個(gè)工廠為生產(chǎn)的,即最終選用哪個(gè)具體工廠的決定權(quán)在生產(chǎn)者一方,它們根據(jù)當(dāng)前系統(tǒng)的情況來實(shí)例化一個(gè)具體的工廠返回給使用者,而這個(gè)決策過程這對(duì)于使用者來說是透明的。典型例子:車子繼承vehicle(車)類,有小汽車卡,公交車bus等,車子工廠實(shí)現(xiàn)工廠接口,工廠接口有抽象方法vehicle produce vehicle(String type)方法,車子工廠中實(shí)現(xiàn)工廠方法vehicle produce vehicle(String Type

16、),方法中根據(jù)需要new新的車子。15模板方法模式優(yōu)點(diǎn):模板方法模式通過把不變的行為搬移到超類,去除子類中的重復(fù)代碼來體現(xiàn)它的優(yōu)勢(shì)。模板方法模式提供了一個(gè)很好的代碼復(fù)用平臺(tái)。缺點(diǎn):沒啥明顯缺點(diǎn)吧?簡(jiǎn)單實(shí)用的設(shè)計(jì)模式。用途:當(dāng)不變的和可變的行為在方法的子類實(shí)現(xiàn)中混合在一起的時(shí)候,不變的行為會(huì)在子類中重復(fù)出現(xiàn),我們可以通過模板方法牧師把這些行為搬移到單一的地方(方法)中,這樣就幫助子類擺脫重復(fù)的不變行為的糾纏。典型例子:泡茶和泡咖啡兩個(gè)動(dòng)作很像,都有煮開水()方法,放入茶或咖啡()方法,把泡好的導(dǎo)入被子,加調(diào)料,這四個(gè)動(dòng)作在一起算是完成泡咖啡行為。在這里,我們可以把泡茶和泡咖啡都繼承于抽象類飲料中

17、,而飲料類有個(gè)模板方法,templateMethod()這個(gè)方法封裝其他幾個(gè)行為方法。而客戶端想執(zhí)行那幾個(gè)方法的時(shí)候,只需要調(diào)用emplateMethod()模板方法。我們會(huì)把templateMethod()方法用final修飾,以免這個(gè)算法骨架被重寫而改變。16外觀模式優(yōu)點(diǎn):1. 對(duì)客戶屏蔽了其子系統(tǒng)組件,因而減少了客戶處理對(duì)象的數(shù)目,并使得子系統(tǒng)實(shí)用起來更方便2. 它實(shí)現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系,而子系統(tǒng)內(nèi)部的功能組件往往是緊耦合的。松耦合關(guān)系使得子系統(tǒng)的組件變化不會(huì)影響到它的客戶。 Facade模式有助于建立層次結(jié)構(gòu)系統(tǒng),也有助于對(duì)對(duì)象之間的依賴關(guān)系分層。 Facade模式還可以消

18、除復(fù)雜的循環(huán)依賴關(guān)系,這一點(diǎn)在客戶程序與子系統(tǒng)是分別實(shí)現(xiàn)的時(shí)候尤為重要。3. 如果應(yīng)用需要,它并不限制它們實(shí)用子系統(tǒng)類。因此你可以在系統(tǒng)易用性和通用性之間進(jìn)行選擇。缺點(diǎn):限制了客戶的自由,減少了可變性。用途:a) 為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口.b) 提高子系統(tǒng)的獨(dú)立性.c) 在層次化結(jié)構(gòu)中,可以使用Facade模式定義系統(tǒng)中每一層的入口。典型例子魔獸插件一鍵換裝,會(huì)同時(shí)調(diào)用更換掉身上的裝備接口和更換角色天賦的接口。17觀察者模式優(yōu)點(diǎn):1.  觀察者和被觀察者之間是松耦合的,分別可以各自獨(dú)立改變。2. Subject在發(fā)送廣播通知的時(shí)候,無須指定具體的Observer,Observ

19、er可以自己決定是否要訂閱Subject的通知。3. 遵守大部分GRASP原則和常用設(shè)計(jì)原則,高內(nèi)聚、低耦合。缺點(diǎn):1. 松耦合導(dǎo)致代碼關(guān)系不明顯,有時(shí)可能難以理解。2. 如果一個(gè)對(duì)象被大量觀察者訂閱的話,在廣播通知的時(shí)候可能會(huì)有效率問題。(畢竟只是簡(jiǎn)單的遍歷)使用場(chǎng)景1、 對(duì)一個(gè)對(duì)象狀態(tài)的更新,需要其他對(duì)象同步更新,而且其他對(duì)象的數(shù)量動(dòng)態(tài)可變。2、 對(duì)象僅需要將自己的更新通知給其他對(duì)象而不需要知道其他對(duì)象的細(xì)節(jié)。經(jīng)典例子:看電視,天氣預(yù)報(bào)看新聞聯(lián)播,觀眾們是觀察者,新聞聯(lián)播是對(duì)象,每個(gè)觀察者都繼承于一個(gè)統(tǒng)一的接口。而被觀察的對(duì)象是新聞聯(lián)播,新聞聯(lián)播可以添加新的觀察者,或者當(dāng)移除觀察者(關(guān)電視

20、不看),新聞聯(lián)播對(duì)象有個(gè)通知用戶信息變更方法,當(dāng)達(dá)到某種條件是,新聞聯(lián)播對(duì)象會(huì)將信息都通知給觀察者。18抽象工廠模式優(yōu)點(diǎn):1. 抽象工廠模式隔離了具體類的生產(chǎn),使得客戶并不需要知道什么被創(chuàng)建2. 當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象3. 增加新的具體工廠和產(chǎn)品族很方便,無須修改已有系統(tǒng),符合“開閉原則”缺點(diǎn):增加新的產(chǎn)品等級(jí)結(jié)構(gòu)很復(fù)雜,需要修改抽象工廠和所有的具體工廠類,對(duì)“開閉原則”的支持呈現(xiàn)傾斜性。用途:1、一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié),這對(duì)于所有類型的工廠模式都是重要的。2、系統(tǒng)中有多于一個(gè)的產(chǎn)品族,而每次

21、只使用其中某一產(chǎn)品族。3、屬于同一個(gè)產(chǎn)品族的產(chǎn)品將在一起使用,這一約束必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來。4、系統(tǒng)提供一個(gè)產(chǎn)品類的庫(kù),所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于具體實(shí)現(xiàn)。經(jīng)典例子:抽象工廠在我的理解就是抽象工廠有兩個(gè)或兩個(gè)個(gè)以上的工廠方法模式結(jié)合,有一個(gè)工廠接口類,這個(gè)接口有中的產(chǎn)品家族有發(fā)動(dòng)機(jī)和輪胎兩個(gè)產(chǎn)品。有兩個(gè)具體工廠,米其林工廠和倍耐力工廠實(shí)現(xiàn)了抽象工廠。米其林工廠生產(chǎn)的輪胎都繼承于米其林輪胎,同理米其林發(fā)動(dòng)機(jī)和倍耐力產(chǎn)品。19狀態(tài)模式優(yōu)點(diǎn):1. 把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同狀態(tài)的一系列類當(dāng)中,可以把復(fù)雜的判斷邏輯簡(jiǎn)化。2. 將與特定狀態(tài)相關(guān)的行為局部化,并且將不同狀態(tài)

22、的行為分割開來。3. 通過把各種狀態(tài)轉(zhuǎn)移邏輯分不到狀態(tài)與其子類之間,來減少相互間的依賴。缺點(diǎn):策略模式,每個(gè)具體狀態(tài)類都會(huì)產(chǎn)生一個(gè)新類,所以會(huì)增加系統(tǒng)需要維護(hù)的類的數(shù)量??梢允褂霉S方法來解決。(我只是把策略二字換成了狀態(tài))用途:1.一個(gè)對(duì)象的行為取決于它的狀態(tài),并且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)改變它的行為。2.一個(gè)操作中含有龐大的多分支結(jié)構(gòu),并且這些分支決定于對(duì)象的狀態(tài)。經(jīng)典例子:我上班,上午點(diǎn),下午,晚上各個(gè)時(shí)間段不同狀態(tài)不同算法。這三個(gè)狀態(tài)都繼承一個(gè)統(tǒng)一的狀態(tài)類。都有重寫work()方法,在我調(diào)用work的時(shí)候,會(huì)根據(jù)不同的狀態(tài)調(diào)用不同的work。20適配器模式優(yōu)點(diǎn):1. 將目標(biāo)類和適配者類

23、解耦2. 增加了類的透明性和復(fù)用性,將具體的實(shí)現(xiàn)封裝在適配者類中,對(duì)于客戶端類來說是透明的,而且提高了適配者的復(fù)用性3. 靈活性和擴(kuò)展性都非常好,符合開閉原則缺點(diǎn):一次最多只能適配一個(gè)適配者類,而且目標(biāo)抽象類只能為接口,不能為類,其使用有一定的局限性,不能將一個(gè)適配者類和他的子類同時(shí)適配到目標(biāo)接口。用途:想使用一個(gè)已經(jīng)存在的類,但如果它的接口和你的要求不相同時(shí)。可以使用適配器模式。兩個(gè)類所做的事情相同或相似,但接口不同時(shí)可以使用。經(jīng)典例子:不同牌子電視機(jī)和不同牌子遙控器,里皮翻譯用漢語布置恒大隊(duì)員戰(zhàn)術(shù),不同牌子手機(jī)的軟件。球員都繼承于中國(guó)人,都會(huì)說漢語,而里皮并不會(huì)說漢語。在不知戰(zhàn)術(shù)的時(shí)候,我

24、們需要給里皮一個(gè)翻譯,這個(gè)翻譯就是里皮的適配器。翻譯可以和球員一樣,也繼承于中國(guó)人,也有說漢語這個(gè)方法。而翻譯認(rèn)識(shí)里皮,翻譯在說漢語()這個(gè)方法的時(shí)候,實(shí)際上是在說里面用意大利語的內(nèi)容。Fanyi.shuohanyu()Lipi.yidaliyu();21組合模式優(yōu)點(diǎn):1. 使客戶端調(diào)用簡(jiǎn)單,客戶端可以一致的使用組合結(jié)構(gòu)或其中單個(gè)對(duì)象,用戶就不必關(guān)心自己處理的是單個(gè)對(duì)象還是整個(gè)組合結(jié)構(gòu),這就簡(jiǎn)化了客戶端代碼。2. 更容易在組合體內(nèi)加入對(duì)象部件. 客戶端不必因?yàn)榧尤肓诵碌膶?duì)象部件而更改代碼。這一點(diǎn)符合開閉原則的要求,對(duì)系統(tǒng)的二次開發(fā)和功能擴(kuò)展很有利!缺點(diǎn):組合模式不容易限制組合中的構(gòu)件用途:當(dāng)你

25、發(fā)現(xiàn)需求中是體現(xiàn)部分與整體層次的結(jié)構(gòu)時(shí),以及你希望可以忽略組合對(duì)象與單個(gè)對(duì)象的不同,統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象時(shí),就應(yīng)該考慮使用組合模式了。典型例子:樹形結(jié)構(gòu),android界面控件22迭代器模式優(yōu)點(diǎn):1. 簡(jiǎn)化了遍歷方式,對(duì)于對(duì)象集合的遍歷,還是比較麻煩的,對(duì)于數(shù)組或者有序列表,我們尚可以通過游標(biāo)來取得,但用戶需要在對(duì)集合了解很清楚的前提下,自行遍歷對(duì)象,但是對(duì)于hash表來說,用戶遍歷起來就比較麻煩了。而引入了迭代器方法后,用戶用起來就簡(jiǎn)單的多了。2. 可以提供多種遍歷方式,比如說對(duì)有序列表,我們可以根據(jù)需要提供正序遍歷,倒序遍歷兩種迭代器,用戶用起來只需要得到我們實(shí)現(xiàn)好的迭代器,就可

26、以方便的對(duì)集合進(jìn)行遍歷了。3. 封裝性良好,用戶只需要得到迭代器就可以遍歷,而對(duì)于遍歷算法則不用去關(guān)心。缺點(diǎn):對(duì)于比較簡(jiǎn)單的遍歷(像數(shù)組或者有序列表),使用迭代器方式遍歷較為繁瑣,大家可能都有感覺,像ArrayList,我們寧可愿意使用for循環(huán)和get方法來遍歷集合,操作簡(jiǎn)易度完爆迭代。用途: 迭代器模式是與集合共生共死的,一般來說,我們只要實(shí)現(xiàn)一個(gè)集合,就需要同時(shí)提供這個(gè)集合的迭代器,就像java中的Collection,List、Set、Map等,這些集合都有自己的迭代器。假如我們要實(shí)現(xiàn)一個(gè)這樣的新的容器,當(dāng)然也需要引入迭代器模式,給我們的容器實(shí)現(xiàn)一個(gè)迭代器。 但是,由于容器與迭代器的關(guān)系太密切了,所以大多數(shù)語言在實(shí)現(xiàn)容器的時(shí)候都給提供了迭代器,并且這些語言提供的容器和迭代器在絕大多數(shù)情況下就可以滿足我們的需要,所以現(xiàn)在需要我們自己去實(shí)踐迭代器模式的場(chǎng)景還是比較少見的,我們只需要使用語言中已有的容器和迭代器就可以了。 典型例子:Iterator用多了,想不出啥經(jīng)典例子。23單例模式優(yōu)點(diǎn):1.

溫馨提示

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