大話設計模式之依賴倒轉原則
阿新 • • 發佈:2017-06-23
銷售員 bsp foo content interface 客戶 依賴倒轉原則 str 基本
上述這樣做是沒有問題的。可是假設客戶想要買其他的東西呢?這時候,我們可能就會想要在建一個類,讓客戶依賴它。這時候,就要改動Client類和加入一個類了。
這樣是不是科擴展性就非常棒了,當然這是橫向擴展,縱向是,我們能夠加入另外一個類:銷售員,讓銷售員類依賴接口即可了。
依賴倒轉原則:
定義:
在大話中最重要的兩句話是:抽象不應該依賴與細節,細節應該依賴於抽象。還有一句是:針對接口編程,不要對實現編程。
問題:
類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()); } }
假設我們設計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.抽象不應該依賴細節。
細節應該依賴抽象。
大話設計模式之依賴倒轉原則