類與類之間都通過AbstractLayer來組合關(guān)系。實例說明DIP
反面例子:
缺點:耦合太緊密,Light發(fā)生變化將影響ToggleSwitch。
解決辦法一:
將Light作成Abstract,然后具體類繼承自Light。
優(yōu)點:ToggleSwitch依賴于抽象類Light,具有更高的穩(wěn)定性,而BulbLight與TubeLight繼承自Light,可以根據(jù)"開放-封閉"原則進(jìn)行擴(kuò)展。只要Light不發(fā)生變化,BulbLight與TubeLight的變化就不會波及ToggleSwitch。
缺點:如果用ToggleSwitch控制一臺電視就很困難了??偛荒茏孴V繼承自Light吧。
解決方法二:
優(yōu)點:更為通用、更為穩(wěn)定。
總結(jié)
DIP要求客戶端依賴于抽象耦合,抽象不應(yīng)當(dāng)依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴于抽象(Abstractionsshouldnotdependupondetails.Detailsshoulddependuponabstractions),這個原則的另外一個表述就是"四人團(tuán)"強(qiáng)調(diào)的那個:要針對接口編程,不要對實現(xiàn)編程(Programtoaninterface,notanimplementation),程序在需要引用一個對象時,應(yīng)當(dāng)盡可能的使用抽象類型作為變量的靜態(tài)類型,這就是針對接口編程的含義。DIP是達(dá)到"開-閉"原則的途徑。
要做到DIP,用抽象方式耦合是關(guān)鍵。由于一個抽象耦合總要涉及具體類從抽象類繼承。并且需要保證在任何引用到某類的地方都可以改換成其子類,因此,LSP是DIP的基礎(chǔ)。DIP是OOD的核心原則,設(shè)計模式的研究和應(yīng)用都是用它作為指導(dǎo)原則的。DIP雖然強(qiáng)大,但是也很難實現(xiàn)。另外DIP是假定所有的具體類都會變化,這也不是全對,有些具體類就相當(dāng)穩(wěn)定。使用這個類的客戶端就完全可以依賴這個具體類而不用再弄一個抽象類。
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com