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

  依賴倒轉原則:

 定義:

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

 問題:

 類A直接依賴類B,假如要將類A改成依賴C,則必須經過須要修改類A的代碼來達成,但若是,類A是高級模塊,負責業務邏輯;類B和類C是低層模塊,負責基本的源自操做,這樣改變A會給程序帶來沒必要要的風險。框架

 解決方案:

 將類A修改成依賴接口I,類B和類C各自實現接口I,類A經過接口I來與類B和C發生纖細,則會大大下降修改A的概率。spa

 基本思想:

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

 具體的例子:

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

 

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類和添加一個類了。若是咱們設計端口,讓各類低層模塊實現端口,而客戶只依賴端口不就好了。在看第二段代碼。

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.抽象不該該依賴細節。細節應該依賴抽象。string