1. 程式人生 > >大話設計模式之依賴倒轉原則

大話設計模式之依賴倒轉原則

銷售員 bsp foo content interface 客戶 依賴倒轉原則 str 基本

依賴倒轉原則:

定義:

在大話中最重要的兩句話是:抽象不應該依賴與細節,細節應該依賴於抽象。還有一句是:針對接口編程,不要對實現編程。

問題:

類A直接依賴類B。假如要將類A改為依賴C。則必須通過須要改動類A的代碼來達成。但假設,類A是高級模塊,負責業務邏輯;類B和類C是低層模塊。負責主要的源自操作。這樣改變A會給程序帶來不必要的風險。

解決方式:

將類A改動為依賴接口I,類B和類C各自實現接口I,類A通過接口I來與類B和C發生纖細,則會大大減少改動A的幾率。

基本思想:

用抽象構建框架。用事先擴展細節,相對於細節的多邊性,抽象的東西要穩定的多。

詳細的樣例:

場景:客戶去商場買東西。要買水果,買的東西是低層模塊,客戶是高層模塊,它決定了要買什麽。

    class FoodA //低層的實現
    {
        public string Take()
        {
            return "水果";
        }
    }
    class Client
    {
        public void client(FoodA a)
        {
            Console.WriteLine("我想要");
            Console.WriteLine(a.Take());
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Client client = new Client();
            client.client(new FoodA());
        }
    }
上述這樣做是沒有問題的。可是假設客戶想要買其他的東西呢?這時候,我們可能就會想要在建一個類,讓客戶依賴它。這時候,就要改動Client類和加入一個類了。

假設我們設計port,讓各種低層模塊實現port。而客戶僅僅依賴port不即可了。在看第二段代碼。

    interface IFood//體現抽象
    {
        string take();
    }
    class FoodA : IFood //讓低層的模塊實現接口
    {
        public string take()
        {
            return "水果";
        }
    }
    class FoodB : IFood
    {
        public string take()
        {
            return "蔬菜";
        }
    }

    class Client
    {
        public void client(IFood ifood)//高級模塊依賴接口
        {
            Console.WriteLine("我想要");
            Console.WriteLine(ifood.take());
        }
    }
    class program
    {
        static void Main(string[] args)
        {
            Client client = new Client();
            client.client(new FoodA());//實現接口
            client.client(new FoodB());
        }
    }

這樣是不是科擴展性就非常棒了,當然這是橫向擴展,縱向是,我們能夠加入另外一個類:銷售員,讓銷售員類依賴接口即可了。

依賴倒轉原則中心思想:

A.高層模塊不應該依賴低層模塊。兩個都應該依賴抽象。

B.抽象不應該依賴細節。

細節應該依賴抽象。

大話設計模式之依賴倒轉原則