設計模式六大原則--依賴倒轉原則
背景
前段時間有同學感覺自己電腦內存不夠用了想買個內存條,隻看她在網上搗鼓了一會就搞定了。也沒見她看內存條的具體型號是否可以在其電腦上使用等等知識。一時不得其解,網上查了查才知道電腦的硬件是麵向接口設計的,最近正好在學習設計模式,我想這是不是和設計模式中的依賴倒轉原則有點關係。下麵就讓小生帶領大家詳細了解一下“依賴倒轉原則(Dependence Inversion Principle)”吧。
定義
1、高層模塊不應該依賴底層模塊,兩者都應該依賴抽象。
2、抽象不應該依賴於細節,細節應該依賴於抽象。
(原意:High level modules should not dependupon low level modules. Both should depend upon abstractions. Abstractionsshould not depend upon details. Details should depend upon abstractions)
詳細說明
依賴倒轉其實可以說是麵向對象設計的標誌,用那種語言來編寫程序不重要,如果編寫時考慮的都是如何針對抽象編程而不是針對細節編程。
示例
假設我們有一個上層類Manager和底層類Worker。我們需要在程序中添加一個新模塊,為此我們創建一個新的類SuperWorker。
我們假設Manager是一個包含非常複雜的邏輯的類,現在引入新的SuperWorker,我們需要修改它。這樣Manager類中一些現有功能可能受到影響,我們需要重新做單元測試,和其他一係列的問題。
所有的問題我們需要用大量的時間去解決,但是如果程序的設計符合依賴倒轉原則將會非常簡單。我們可以設計一個接口IWorker,讓Worker類去實現它。當需要添加SuperWorker類時,我們隻需要讓它實現IWorker接口即可,這樣就避免了Manger類的改動。
下麵是不符合依賴倒轉原則的代碼。
//Dependency Inversion Priciple-Bad example class Worker { public void Work() { //......working } } class Manager { Worker worker = new Worker(); public void SetWorker(Worker w) { worker = w; } public void Manage() { worker.Work(); } } class SuperWorker { public void Work() { //......working much more } }
下麵是支持依賴倒轉原則的代碼。增加一個新的抽象層IWork接口。使得增添SuperWorker累世不需要修改Manager類使其對Manager類現有功能的影響最小化。
//Dependency Inversion Priciple-Good example interface IWorker { public void Work(); } class Worker:IWorker { public void Work() { //......working } } class SuperWorker : IWorker { public void Work() { //......working much more } } class Manager { Worker worker = new Worker(); public void SetWorker(Worker w) { worker = w; } public void Manage() { worker.Work(); } }
(實例來源:https://zjliu.iteye.com/blog/423221#,與此同時設計模式中大量的用到了這個原則,想深入研究的朋友可以了解一下)
優點
采用依賴倒置原則可以減少類間的耦合性,提高係統的穩定性,減少並行開發引起的風險,提高代碼的可讀性和可維護性。
最後更新:2017-04-03 12:55:07