閱讀703 返回首頁    go 阿裏雲 go 技術社區[雲棲]


設計模式六大原則--依賴倒轉原則

       背景

       前段時間有同學感覺自己電腦內存不夠用了想買個內存條,隻看她在網上搗鼓了一會就搞定了。也沒見她看內存條的具體型號是否可以在其電腦上使用等等知識。一時不得其解,網上查了查才知道電腦的硬件是麵向接口設計的,最近正好在學習設計模式,我想這是不是和設計模式中的依賴倒轉原則有點關係。下麵就讓小生帶領大家詳細了解一下“依賴倒轉原則(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

  上一篇:go 設計模式之部分-整體模式
  下一篇:go 再回首2013