面向對象原則之一 依賴倒置原則


前言

面向對象有人分為五大原則,分別為單一職責原則、開放封閉原則、依賴倒置原則、接口隔離原則、里氏替換原則。

也有人分為六大原則,分別為單一職責原則、開放封閉原則、依賴倒置原則、接口隔離原則、里氏替換原則、迪米特法則。

 

現在我們來介紹依賴倒置原則

 

依賴倒置原則

1)概念

a.高層模塊不應該依賴於底層模塊,兩者應該依賴於其抽象。

b.抽象不應該依賴具體實現,具體實現應該依賴抽象。

上面2點是依賴倒置原則的概念,也是核心。主要是說模塊之間不要依賴具體實現,依賴接口或抽象。

其實依賴倒置原則的核心思想是面向接口編程。

2)例子

依賴倒置原則其實也沒什么可以說的,下面我們來舉個例子吧。

比如,學生看語文書。我們就實現這兩個類,一個是學生,一個是語文書。學生依賴於語文書,所以語文書是學生的一個屬性。

UML圖如下:

image

類如下。

首先是學生Student類:

public class Student
    {

        public void DoSomething(YuWenBook book)
        {
            book.LookYuWenBook();
        }

    }

然后是語文書類YuWenBook類:

public class YuWenBook
    {

        public void LookYuWenBook()
        {
            Console.WriteLine("看語文書");
        }

    }

最后,我們開始調用:

class Program
    {
        static void Main(string[] args)
        {
            YuWenBook book = new YuWenBook();
            Student student = new Student();
            student.DoSomething(book);

        }
    }

以上程序都沒有錯,new一個語文的對象,然后new一個學生對象,最后把語文對象賦值到學生的book中。完成了學生看書。

但是,這是不好擴展的,拋離了面向對象的低耦合,高內聚的思想。因為,如果,我們要添加學生看英語書,那怎么添加呢?

首先,在Student類中添加方法DoSomething(EnglishBook book); 然后再實現EnghlishBook類的LookEnglishBook方法。

最后調用,變成:

static void Main(string[] args)
        {
            YuWenBook book = new YuWenBook();
            Student student = new Student();
            student.DoSomething(book);

            //學生看英語書
            EnglishBook englishBook = new EnglishBook();
            student.DoSomething(englishBook);

        }

 

一看,就知道不好擴展。因為已經修改了Student類中代碼(增加了方法)。怎么才算好擴展呢,那么要聊起與開閉原則有關系了。對修改關閉,對擴展開放。所以我們盡量的不要修改Student類中的代碼。所以,我們增加一個接口,叫IBook:

public interface IBook
    {

        void LookBook();

    }

然后,英語、語文各自繼承IBook:

    public class EnglishBook: IBook
    {
        public void LookBook()
        {
            Console.WriteLine("看英語書");
        }

    }

    public class YuWenBook:IBook
    {

        public void LookBook()
        {
            Console.WriteLine("看語文書");
        }

    }

再修改一下Student的方法,接收IBook參數,變成:

public class Student
    {

        public void DoSomething(IBook book)
        {
            book.LookBook();
        }

    }

最后,看我們是怎么調用的:

static void Main(string[] args)
        {
            IBook book = new YuWenBook();
            Student student = new Student();
            student.DoSomething(book);

            //學生看英語書
            book = new EnglishBook();
            student.DoSomething(book);

        }

看看,是不是可以很方面的擴展? 為什么這樣說呢?

因為當我們再添加一個學生看數學書的時候,我們只需要添加一個數學書類來繼承IBook,然后實現LookBook方法。最后我們用IBook對象來調用數學書類就可以了。可以看出,Student不用做任何修改,IBook也是。只需做相應的實現與調用即可。

 

3)小結

到此,介紹與例子到此結束了,我們可以看到面向對象的設計是多么的廣、深。從一些小小的例子、甚至身邊發生的事,都可以聯想到面向對象的設計。要掌握面向對象,首先要掌握其原則。

 

其他鏈接:

開放封閉原則(開閉原則)

單一職責原則

依賴倒置原則

接口隔離原則

里氏替換原則

迪米特法則

 

此文轉發,請注明出處,謝謝。

 

 

可以關注本人的公眾號,多年經驗的原創文章共享給大家。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM