橋接模式(Bridge)
使用橋接模式不只改變你的實(shí)現(xiàn),也改變你的抽象。橋接模式通過(guò)將實(shí)現(xiàn)和抽象放在兩個(gè)不同的類層次中而使它們可以獨(dú)立改變。
橋接的優(yōu)點(diǎn):
-將實(shí)現(xiàn)予以解耦,讓它和界面之間不再永久綁定。
-抽象和實(shí)現(xiàn)可以獨(dú)立擴(kuò)展,不會(huì)影響到對(duì)方。
-對(duì)于“具體的抽象類”所做的改變,不會(huì)影響到客戶。
橋接的用途和缺點(diǎn):
-適合使用在需要跨越多個(gè)平臺(tái)的圖形和窗口系統(tǒng)上。
-當(dāng)需要用不同的方法改變接口和實(shí)現(xiàn)時(shí),你會(huì)發(fā)現(xiàn)橋接模式很好用。
-橋接模式的缺點(diǎn)是增加了復(fù)雜度。
示例:控制器與界面各自的抽象
生成器模式(Builder)
-使用生成器模式封裝一個(gè)產(chǎn)品的構(gòu)造過(guò)程,并允許按步驟構(gòu)造。
生成器的優(yōu)點(diǎn):
-將一個(gè)復(fù)雜對(duì)象的創(chuàng)建過(guò)程封裝起來(lái)。
-允許對(duì)象通過(guò)多個(gè)步驟來(lái)創(chuàng)建,并且可以改變過(guò)程(這和只有一個(gè)步驟的工程模式不同)。
-向客戶隱藏產(chǎn)品內(nèi)部的實(shí)現(xiàn)。
-產(chǎn)品的實(shí)現(xiàn)可以被替換,因?yàn)榭蛻糁豢吹揭粋€(gè)抽象的接口。
生成器的用途和缺點(diǎn):
-經(jīng)常被用來(lái)創(chuàng)建組合結(jié)構(gòu)
-與工廠模式相比,采用生成器模式創(chuàng)建對(duì)象的客戶,需要具備更多的領(lǐng)域知識(shí)。
示例:度假計(jì)劃
責(zé)任鏈模式(Chain of responsibility)
當(dāng)你想要讓一個(gè)以上的對(duì)象有機(jī)會(huì)能夠處理某個(gè)請(qǐng)求的時(shí)候,就使用責(zé)任鏈模式。
責(zé)任鏈模式的優(yōu)點(diǎn):
-將請(qǐng)求的發(fā)送者和接受者解耦
-可以簡(jiǎn)化你的對(duì)象,因?yàn)樗恍枰梨湹慕Y(jié)構(gòu)
-通過(guò)改變鏈內(nèi)的成員或調(diào)動(dòng)它們的次序,允許你動(dòng)態(tài)地新增或者刪除責(zé)任
責(zé)任鏈的用途與缺點(diǎn):
-經(jīng)常被使用在窗口系統(tǒng)中,處理鼠標(biāo)和鍵盤(pán)之類的事件
-并不保證請(qǐng)求一定會(huì)被執(zhí)行;如果沒(méi)有任何對(duì)象處理它的話,它可能會(huì)落到鏈尾之外(這可以是優(yōu)點(diǎn)也可以是缺點(diǎn))
-可能不容易觀察運(yùn)行時(shí)的特征,有礙于除錯(cuò)
示例:不同郵件(垃圾郵件,F(xiàn)ans郵件,客服郵件,業(yè)務(wù)郵件等)的處理
享元模式(Flyweight)
如想讓某個(gè)類的一個(gè)實(shí)例能用來(lái)提供許多“虛擬實(shí)例”,就是用享元模式
享元模式的優(yōu)點(diǎn):
-減少運(yùn)行時(shí)對(duì)象實(shí)例的個(gè)數(shù),節(jié)省內(nèi)存
-將許多“虛擬對(duì)象”的狀態(tài)集中管理
享元模式的用途與缺點(diǎn):
-當(dāng)一個(gè)類有許多的實(shí)例,而這些實(shí)例能被同一方法控制的時(shí)候,我們就可以使用享元模式
-缺點(diǎn):一旦你實(shí)現(xiàn)了它,那么單個(gè)的邏輯實(shí)例將無(wú)法擁有獨(dú)立而不同的處理
享元模式
示例:景觀設(shè)計(jì)中的點(diǎn)綴樹(shù)的顯示(只一個(gè)樹(shù)實(shí)例,共享位置年輪信息)
解釋器模式(Intepreter)
使用解釋器模式為語(yǔ)言創(chuàng)建解釋器
解釋器的優(yōu)點(diǎn):
-將每一個(gè)語(yǔ)法規(guī)則表示成一個(gè)類,方便于實(shí)現(xiàn)語(yǔ)言
-因?yàn)檎Z(yǔ)法由許多類表示,所以你可以輕易地改變或擴(kuò)展此語(yǔ)言
-通過(guò)在類結(jié)構(gòu)中加入新的方法,可以在解釋的同時(shí)增加新的行為,例如打印格式的美化或者進(jìn)行復(fù)雜的程序驗(yàn)證
解釋器的用途與缺點(diǎn):
-當(dāng)你需要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的語(yǔ)言時(shí),使用解釋器
-當(dāng)你有一個(gè)簡(jiǎn)單的語(yǔ)法,而且簡(jiǎn)單比效率更重要時(shí),使用解釋器
-可以處理腳本語(yǔ)言和編程語(yǔ)言
-當(dāng)語(yǔ)言規(guī)則的數(shù)碼太大時(shí),這個(gè)模式可能會(huì)變得相當(dāng)繁雜,在這種情況下,使用解釋器/編譯器的產(chǎn)生器可能更合適
示例:Duck pond控制鴨子的語(yǔ)言解釋器
中介者模式(Mediator)
使用中介者模式來(lái)集中相關(guān)對(duì)象之間復(fù)雜的溝通和控制方式。每個(gè)對(duì)象都會(huì)在自己的狀態(tài)改變時(shí),告訴中介者,每個(gè)對(duì)象都會(huì)對(duì)中介者所發(fā)出的請(qǐng)求作出反應(yīng)。中介者內(nèi)包含了整個(gè)系統(tǒng)的控制邏輯。當(dāng)某個(gè)對(duì)象需要一個(gè)新的規(guī)則時(shí),或者是一個(gè)新的對(duì)象被加入系統(tǒng)內(nèi),其所有需要用到的邏輯也都被加入中介者內(nèi)。
中介者模式的優(yōu)點(diǎn):
-通過(guò)將對(duì)象彼此解耦,可以增加對(duì)象的復(fù)用性
-通過(guò)將控制邏輯集中,可以簡(jiǎn)化系統(tǒng)維護(hù)
-可以讓對(duì)象之間所傳遞的消息變得簡(jiǎn)單而且大幅減少
中介者模式的用途和缺點(diǎn):
-中介者模式常常被用來(lái)協(xié)調(diào)相關(guān)的GUI組件
-中介者模式的缺點(diǎn)是:如果設(shè)計(jì)不當(dāng),中介者對(duì)象本身會(huì)變得過(guò)于復(fù)雜
示例:生活自動(dòng)機(jī)(鬧鈴,煮咖啡,日歷,噴頭)
備忘錄模式(Memento)
當(dāng)你需要讓對(duì)象返回之前的狀態(tài)時(shí)(例如:undo),就使用備忘錄模式。備忘錄模式有兩個(gè)目標(biāo):儲(chǔ)存系統(tǒng)關(guān)鍵對(duì)象的重要狀態(tài);維護(hù)關(guān)鍵對(duì)象的封裝。請(qǐng)不要忘記單一責(zé)任原則,不要把保持狀態(tài)的工作和關(guān)鍵對(duì)象混在一起,這樣比較好。這個(gè)專門掌握狀態(tài)的對(duì)象就稱為備忘錄。
備忘錄模式的優(yōu)點(diǎn):
-被儲(chǔ)存的狀態(tài)放在外面,不要和關(guān)鍵對(duì)象混在一起,這可以幫助維護(hù)內(nèi)聚
-保持關(guān)節(jié)對(duì)象的數(shù)據(jù)封裝
-提供了容易實(shí)現(xiàn)的恢復(fù)能力
備忘錄模式的用途和缺點(diǎn):
-備忘錄用于儲(chǔ)存狀態(tài)
-使用備忘錄的缺點(diǎn):儲(chǔ)存和恢復(fù)狀態(tài)的過(guò)程可能相當(dāng)耗時(shí)
-在Java系統(tǒng)中,其實(shí)可以考慮使用序列化(Serialization)機(jī)制儲(chǔ)存系統(tǒng)的狀態(tài)
示例:游戲中的存儲(chǔ)進(jìn)度功能
原型模式(Prototype)
當(dāng)創(chuàng)建給定類的實(shí)例的過(guò)程很昂貴或很復(fù)雜時(shí),就使用原型模式。原型模式允許你通過(guò)使用復(fù)制現(xiàn)有的實(shí)例來(lái)創(chuàng)建新的實(shí)例(在Java中,這通常意味著使用clone()方法或者反序列化)。這個(gè)模式的重點(diǎn)在于,客戶的代碼在不知道要實(shí)例化何種特定類的情況下,可以制造出新的實(shí)例。
原型模式的優(yōu)點(diǎn):
-向客戶隱藏制造新實(shí)例的復(fù)雜性
-提供客戶能夠產(chǎn)生未知類型對(duì)象的選項(xiàng)
-在某些環(huán)境下,復(fù)制對(duì)象比創(chuàng)建新對(duì)象更有效
原型模式的用途和缺點(diǎn):
-在一個(gè)復(fù)雜的類層次中,當(dāng)系統(tǒng)必須從其中的許多類型創(chuàng)建新對(duì)象時(shí),可以考慮原型
-缺點(diǎn):對(duì)象的復(fù)制有時(shí)相當(dāng)復(fù)雜
示例:在游戲中創(chuàng)建各式各樣的怪獸
訪問(wèn)者模式(Visitor)
當(dāng)你想要為一個(gè)對(duì)象的組合增加新的能力,且封裝并不重要時(shí),就使用訪問(wèn)者模式。
客戶要求訪問(wèn)者從組合結(jié)構(gòu)中取得信息,新方法可以被加入到訪問(wèn)者中,而不會(huì)影響組合;訪問(wèn)者需要能夠調(diào)用組合類的getState(),而這也正是你能夠加入新方法以讓客戶使用的地方;所有的這些組合類必須做的事情就是加入一個(gè)getState()方法,而不必?fù)?dān)心暴露他們自己。
訪問(wèn)者模式的優(yōu)點(diǎn):
-允許你對(duì)組合結(jié)構(gòu)加入新的操作,而不需改變結(jié)構(gòu)本身
-想要加入新的操作,相對(duì)容易
-訪問(wèn)者所進(jìn)行的操作,其代碼是集中在一起的
訪問(wèn)者模式的用途和缺點(diǎn):
-當(dāng)采用訪問(wèn)者模式的時(shí)候,就會(huì)打破組合類的封裝
-因?yàn)橛巫叩墓δ軤可嫫渲校詫?duì)組合結(jié)構(gòu)的改變就更加困難
示例:對(duì)鄉(xiāng)村餐廳的菜單添加營(yíng)養(yǎng)成分,能量顯示