本文為敏捷軟件開發(fā) - 原則、模式與實(shí)踐系列的一部分。
本文對應(yīng)原書第25章
ABSTRACT SERVER模式

如上圖在Switch和Light之間引入一個(gè)接口,這樣就使得Switch能夠控制任何實(shí)現(xiàn)了這個(gè)接口的東西。這立即就滿足了DIP和OCP。這個(gè)就是ABSTRACT SERVER模式。
請注意接口的名字是從它的客戶的角度起的。它被稱為Switchable而不是ILight。我們在前面已經(jīng)討論過這個(gè)問題,并且可能還會(huì)再次看到它。接口屬于它的客戶,而不是它的派生類。客戶和接口之間的邏輯綁定關(guān)系要強(qiáng)于接口和它的派生類之間的邏輯綁定關(guān)系。它們之間的關(guān)系強(qiáng)到在沒有Switchable的情況下就無法使用Switch;但是,在沒有Light的情況下卻完全可以使用Switch。邏輯關(guān)系的強(qiáng)度和實(shí)體關(guān)系的強(qiáng)度是不一致的。繼承是一個(gè)比關(guān)聯(lián)強(qiáng)得多的實(shí)體關(guān)系。
ADAPTER模式

上圖是一個(gè)ADAPTER模式例子。Modem接口有4個(gè)方法,新加入一種專線型調(diào)試解調(diào)器,它無需撥號和掛斷,使用專線型調(diào)試解調(diào)器的客戶程序稱為DedUser,同時(shí)又希望現(xiàn)有客戶程序也可以使用這種新型調(diào)試解調(diào)器。在這個(gè)例子中,DedicatedModem不從Modem繼承。DedUser客戶程序通過DedicatedModemAdapter間接地使用DedicatedModem。在這個(gè)適配器的dial和hangup實(shí)現(xiàn)中去模擬鏈接狀態(tài)。它把send和receive調(diào)用委托給DedicatedModem。
BRIDGE模式
Modem問題,還有另外一個(gè)方式。對于專用Modem的需要向Modem類型層次結(jié)構(gòu)中增加一個(gè)新的自由度。在最初構(gòu)思Modem類型時(shí),它只是一組不同硬件設(shè)備的接口。因此,我們讓HayesModem、USModem和ErniesModem從基類Modem派生。但是,現(xiàn)在,出現(xiàn)了另外一種切分Modem層次結(jié)構(gòu)的方式。我們可以讓DialModem和DedicatedModem從Modem派生。
在類型層次結(jié)構(gòu)具有多個(gè)自由度的情況中,BRIDGE模式通常是有用的。我們可以把這些層次結(jié)構(gòu)分開并通過橋把它們結(jié)合在一起,而不是把它們合并起來。

上圖展示了這個(gè)結(jié)構(gòu)。我們把Modem類層次結(jié)構(gòu)分成兩個(gè)層次結(jié)構(gòu)。一個(gè)表示連接方法,另一個(gè)表示硬件。
Modem的使用者繼續(xù)使用Modem接口,ModemConnectionController實(shí)現(xiàn)了Modem接口。ModemConnectionController的派生類控制著連接機(jī)制。DialModemController的dial方法和hangup方法只是轉(zhuǎn)調(diào)用基類ModemConnectionController中的dialImp和hangupImp。接著,這兩個(gè)方法把調(diào)用委托給類ModemImplementation,在那里它們會(huì)被分派到適當(dāng)?shù)挠布刂破?。DedModemController把dial和hangup實(shí)現(xiàn)為模擬連接狀態(tài)。它的send和receive會(huì)轉(zhuǎn)調(diào)用sendImp和receiveImp,并像前面一樣再委托給ModemImplementation層次結(jié)構(gòu)。
請注意,ModemConnectionController基類中的4個(gè)imp方法都是受保護(hù)的。這是因?yàn)樗鼈冎槐籑odemConnectionController的派生類使用。其他任何類都不應(yīng)當(dāng)調(diào)用它們。
結(jié)論
使用ADAPTER模式的解決方案是簡單和直接的。它讓所有的依賴關(guān)系都指向正確的方向,并且實(shí)現(xiàn)起來非常簡單。BRIDGE模式稍微有些復(fù)雜。我建議在開始時(shí)不要使用BRIDGE模式,直到你明顯可以看出需要完全分離連接策略和通訊策略并且需要增加新的連接策略時(shí),才使用這種方法。
完整內(nèi)容請查看敏捷軟件開發(fā) - 原則、模式與實(shí)踐系列