【正文】
lpattern//數(shù)據(jù)對(duì)象的實(shí)現(xiàn)可以在不改變客戶(hù)端代碼的情況下動(dòng)態(tài)進(jìn)行更換。五、可以使用ISP來(lái)給連接控制類(lèi)增加新的接口。在這個(gè)策略的實(shí)現(xiàn)中可以使用sendlmp、receivelmp、 diallmp和hanglmp。它的創(chuàng)建不會(huì)影響到調(diào)制解調(diào)器的使用者,并且還完全分離了連接策略和硬件實(shí)現(xiàn)。一個(gè)表示連接方法,另一個(gè)表示硬件。我們可以把這些層次結(jié)構(gòu)分開(kāi)并通過(guò)橋把它們結(jié)合到一起,而不是把它們合并起來(lái)。如果這兩個(gè)自由度根本就是不穩(wěn)定的,那么不用多久,就會(huì)出現(xiàn)大量的派生類(lèi)。每當(dāng)增加一款新硬件時(shí),就必須創(chuàng)建兩個(gè)新類(lèi)一個(gè)針對(duì)專(zhuān)用的情況,一個(gè)針對(duì)撥號(hào)的情況?,F(xiàn)在,出現(xiàn)了另外一種切分Modem層次結(jié)構(gòu)的方式。雜湊體和系統(tǒng)隔離,藏身于幾乎無(wú)人知曉的適配器中。適配器仍然要模擬連接狀態(tài)。如果使用ADAPTER模式解決最初的問(wèn)題的話(huà),就可以避免這個(gè)嚴(yán)重問(wèn)題。這就是許多項(xiàng)目都會(huì)具有的那種有害的混亂依賴(lài)關(guān)系。糟糕的是,現(xiàn)在必須要去告訴DedUser的編寫(xiě)者,他們必須要更改他們的代碼!你可以想象他們聽(tīng)到這個(gè)會(huì)有多高興。顯然,所有的調(diào)制解調(diào)器客戶(hù)程序都必須更改。一個(gè)可能的解決方案是讓DedicatedModem從Modem派生并且把dial方法和hangup方法實(shí)現(xiàn)為空,就像下面這樣:幾個(gè)月后,已經(jīng)有了大量的DedUser,此時(shí)客戶(hù)提出了一個(gè)新的更改。DedUser只使用 Modem接口,而DedicateModem只實(shí)現(xiàn)Modem接口。我們把撥號(hào)和通信功能分離為兩個(gè)不同的接口。他們不希望去更改許許多多的調(diào)制解調(diào)器客戶(hù)應(yīng)用程序,所以完全可以讓這些調(diào)制解調(diào)器客戶(hù)程序去撥一些假 (dummy)電話(huà)號(hào)碼。我們稱(chēng)這些使用者為DedUser。它們位于一條專(zhuān)用連接的兩端。假定這種情形持續(xù)了幾年,并有許多調(diào)制解調(diào)器的客戶(hù)程序都在使用著Modem接口。它很好地遵循了OCP、LSP和DIP。如圖所示,有大量的調(diào)制解調(diào)器客戶(hù)程序在使用Modem接口。它深入的闡述了《Design Patterns Explained》一書(shū)中1)Design to interfaces. 2)Favor position over inheritance. 3)Find what varies and encapsulate it的三個(gè)觀點(diǎn)。調(diào)制解調(diào)器問(wèn)題感覺(jué)《敏捷軟件開(kāi)發(fā)-原則、模式與實(shí)踐》中關(guān)于Bridge模式的例子很好。}}ConcreteImplementorB()。=andChange()。newcallimplementation//newabstractionargsMain(staticclasstest//////Operation)。voidoverrideMethods:ConcreteImplementorBclassOperation)。voidoverrideMethods:ConcreteImplementorAclass()。{Operation()public//Abstract