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