1. 程式人生 > 實用技巧 >C# 設計原則-依賴倒置原則

C# 設計原則-依賴倒置原則

  依賴倒置原則,全稱Dependence Inversion Principle,英文縮寫DIP。

  主程式要依賴於抽象介面,不要依賴於具體實現。高層模組不應該依賴底層模組,兩者都應該依賴抽象。抽象不應該依賴細節,細節應該依賴抽象。

  簡單地理解一下這話的意思。

  依賴說的就是耦合性,如果A類依賴於B類,當B類修改或者刪除了,會對A類造成很大影響,那麼就可以說A類是完全為B類服務的。所以說,高層模組不應該依賴底層模組,這樣耦合性太強,不利於以後的升級或拓展。

  兩者應該依賴於抽象。指的是它們共同有一個抽象或介面為父類,因為具體細節還沒實現,所以具有拓展性。

  抽象不應該依賴細節。抽象僅僅是作為定義規範,細節只需要根據規範去實現,抽象不在乎具體如何去實現。

  細節應該依賴抽象。細節的實現必須嚴格按照指定的規範去實現介面或抽象類的方法。

  下面就舉個例子,一個人看書。

public class People
{
    public void ReadStoryBook()
    {
        Console.WriteLine("read storyBook");
    }
}public static void Main(string[] args)
{
    People people = new People();
    people.ReadStoryBook();
}

  這個People類就實現了readStoryBook的方法,但如果這個人想看其它書,那就只能繼續在這個People類上新增新的方法。如果想看的書多了,那麼需要新增的方法便會越來越多,同時,每次都得修改一個在執行得正常的類,容易出現問題。這就需要重新做設計。

  根據依賴倒置原則的高層模組不應該依賴底層模組,這裡就把人和書緊緊關聯在一起,耦合性太強,高層模組方法的呼叫過度依賴於下層模組,不利於拓展。

  那應該如何解決?兩者都應該依賴於抽象,書可以抽象出來,單獨定義一個Read方法。

public interface IBook
{
    void Read();
}

  把讀書方法單獨抽象出來,讓它不依賴於People類。

public class StoryBook : IBook
{
    public void Read()
    {
        Console.WriteLine("read storyBook");
    }
}

public class MathBook : IBook { public void Read() { Console.WriteLine("read mathBook"); } }

  將People類改一下。

public class People
{
    public void ReadBook(IBook book)
    {
        book.Read();
    }
}

public static void Main(string[] args)
{
    People people = new People();
    people.ReadBook(new StoryBook());
    people.ReadBook(new MathBook());
}

  這樣,看書的方法就直接依賴於IBook介面上,拓展也變得方法,不需要去修改底層People類,每次想看不同的書,只需要new一本書就好。因為抽象不應該依賴於細節,對應IBook中的Read方法,並不關心看什麼書,怎麼看書,就只有看書這個動作,不關心細節。