依賴倒置原則(dependence inversion principle)是程式要依賴於抽象介面,不要依賴於具體實現。
簡單的說就是要求對抽象進行程式設計,不要對實現進行程式設計,這樣就降低了客戶與實現模組間的耦合。
小語跟胖子一步三回頭的離開了介面宗之後,來到了依賴宗。
不像介面宗的熱鬧,這裡可就冷清多了,走了半天,乙個人影都沒有看到。
一陣風吹過,只聽見落葉的嘩嘩聲。
一陣寒意讓小語渾身一哆嗦!
小語不由的問旁邊的胖子,「這裡真的有人麼?怎麼感覺鬼氣森森的?」
胖子反而一臉輕鬆的道:「當然了!忘了給你說了,依賴宗以暗殺而出名,他們是乙個盛產殺手的宗門,所以有點神秘。」
小語聽到這是個殺手宗門,就更緊張了,不由得跟胖子的距離更近了幾分。
這時,小語突然感覺到有人在拍他的肩膀,身體一緊,慢慢扭過頭去,只見一張陰森森的鬼臉出現在了他的眼前,嚇得他乙個箭步往前,躲在了胖子的身後。
胖子注意到這個鬼臉,反而是一臉喜色,說道:「007你在這裡啊,真是太好了!」
小語一臉懵逼,「007?」
胖子介紹道,「小語,這個是007,是我的乙個熟人。」
這時,007也去掉了鬼臉面具,露出一張陽光帥氣的臉龐。
雙方經過一番介紹,胖子表明了來意,主要是向小語展示各大宗們是如何遵循他們的法則的。
007笑道,「這個簡單,就拿我們殺手為例吧!我們殺手存在的意義是殺人,而這個被殺的「人」並不是乙個明確的個人,只有具體任務下來的時候我們才知道,抹去的目標是誰!用示例來說明一下吧!」
假設007現在要去抹殺掉張三:
//殺手007
public class killer007
}
定義張三
//需要被抹殺的目標 張三
public class zhangsan
public string getname()
}
現在派007去抹殺掉張三
killer007 killer007=new killer007();
killer007.killguys(new zhangsan("張三"));//007殺掉張三
007完美的完成了抹殺張三的任務。
現在上面又給了007新的任務,去抹殺掉李四。
但是007沒有抹殺李四的方法,只能抹殺張三,這就不合理了。只能重新訓練007去具備抹殺其他人的方法(增加新的方法),這顯然不是很合理。
這個時候就到了依賴倒置原則出場的時候了,我們應該面對抽象程式設計,而不應該是具體的細節。
張三和李四的抽象是什麼?
是人!那麼我們遵循依賴倒置原則重新設計。
定義所有人都會實現的抽象類
//所有人都會實現這個類
public abstract class guy
public string getname()
}
殺手007不再依賴細節,依賴於抽象
//殺手007
public class killer007
}
張三和李四實現guy
//需要被抹殺的目標 張三
public class zhangsan extends guy
}//李四
public class lisi extends guy
}
指派007去抹殺掉張三和李四
killer007 killer007=new killer007();
killer007.killguys(new zhangsan("張三"));//007殺掉張三
killer007.killguys(new lisi("李四"));//007殺掉李四
小語雖然明白了,但是卻聽的渾身發寒,第一次見到以殺人來舉例子的。
不過他還是說出了他的疑問,「那麼這個依賴倒置的「倒置」是什麼意思呢?」
007笑道:「說一下我們的第一種設計方式,常規的思考是這樣的:
」殺手---->張三「,
但是我們不想讓殺手全部依賴具體的實現,
接下來就要倒置我們的思想了,我們先從張三來思考:張三抽象出人,張三和殺手都依賴於人這個抽象,
」張三---->人<-----殺手」,
這就是思想的倒置了。「
設計模式之依賴倒轉原則
a.高層模組不應該依賴低層模組。兩個都應該依賴抽象。b.抽象不應該依賴細節。細節應該依賴抽象 物件導向開發時,為了使得常用 可復用,一般都會把這些 寫成許多的函式庫,我們在做專案時呼叫這些底層的 函式就可以了。比如我們做的專案大多低層模組。要訪問資料庫,所以我們就會把訪問資料庫的 寫成函式,每次做新...
設計模式之依賴倒置正規化
定義 高層模組不應該依賴底層模組,二者也不應該存在直接的依賴關係,應依賴於抽象類。理解 倒置 依賴是指乙個類t的細節由另乙個類q實現。若是先定義好類q,然後在類t中直接引用類q,即可實現所需功能,這種依賴行為稱為 正置 若此時定義乙個q的抽象類w,類t中引用的是類w,也能實現所需功能,這種依賴行為稱...
C 設計模式之依賴注入
以下是通過 ioc框架 unity方式實現簡單的依賴注入 1.定義公共介面 inte ce ibook 2.建立兩個類,繼承自介面 ibook class booka ibook public string getname class bookb ibook 3.通過配置檔案註冊容器及指定主函式需要...