1. 程式人生 > >面向對象原則之一 依賴倒置原則

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

write 介紹 耦合 lin 什麽 div ron 修改 人的

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

前言

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

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

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

依賴倒置原則

1)概念

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

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

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

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

2)例子

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

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

UML圖如下:

技術分享圖片

類如下。

首先是學生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)小結

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

其他鏈接:

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

單一職責原則

依賴倒置原則

接口隔離原則

裏氏替換原則

迪米特法則

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

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

技術分享圖片

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