回顧一下一開始大爆炸的製作披薩寫法。如果不管怎樣的pizza,我們都在同一個pizza store裡面的orderpizza判斷各種pizza的口味,並進行判斷,它們的依賴關係就會呈現這樣:(是不是讓人回憶起裝飾器模式的飲料XD)
而設計模式很大的重點就是在降低這些依賴關係,而這也是一條設計原則: 依賴反轉原則(Dependency Inversion Principle)。
要依賴抽象,而非依賴具體類別。
這跟前面提到的第二個原則─針對"介面"而非"實作"寫程式─感覺頗有異曲同工之妙,不過在依賴反轉原則中,則更強調抽象,不管是"高階物件"(用低階組件來定義行為的類別,像此例中的pizza store),或"低階組件"(此例中的pizza),都應該要依賴抽象。
從上面的圖中,可以看到PizzaStore高度依賴各種不同的pizza,而改用工廠方法模式之後,依賴關係就變成這樣:
高階與低些的組件都依賴抽象出來的pizza,這就是實踐此原則的範例,反轉了!
可以藉由以下幾個檢核點來幫助達成依賴反轉的精神:
但切記不要矯枉過正,應該藉由這幾點來檢視有沒有更好的設計,但不是不管在哪裡都要完全地遵守,而是透過思考來判斷這些地方是否有可能變動,需要依靠這些原則來達成更靈活的設計。