C# 設計原則-介面隔離原則
阿新 • • 發佈:2020-12-30
介面隔離原則,全稱InterfaceSegregation Principle,英文縮寫ISP。
客戶端不應該依賴它不需要的介面;一個類對另一個類的依賴應該建立在最小的介面上。
滿足介面隔離原則的前提就是介面設計得不應該過於龐大。舉個例子,現在設計一個動物animal介面,動物應該都會跑步的。
public interface IAnimal { //動物跑步 void Run(); }
然後現在有狗和貓使用介面,也實現了run方法,設計看起來沒有問題。
public class Dog : IAnimal { public void Run() { Console.WriteLine("dog run"); } } public class Cat : IAnimal { public void Run() { Console.WriteLine("cat run"); } }
後面就加入了新的鷹eagle類,鷹是可以飛的,所以在animal介面上新增fly方法,讓鷹可以實現fly的方法。
public interface IAnimal { //動物跑步 void Run(); //動物飛 void Fly(); } public class Eagle : IAnimal {public void Fly() { Console.WriteLine("eagle fly"); } //對於鷹是無用介面 public void Run() { throw new NotImplementedException(); } }
由於修改了animal介面,所以之前的類也需要進行修改。
public class Dog : IAnimal { public void Run() { Console.WriteLine("dog run"); }//對於狗是無用介面 public void Fly() { throw new NotImplementedException(); } } public class Cat : IAnimal { public void Run() { Console.WriteLine("cat run"); } //對於貓是無用介面 public void Fly() { throw new NotImplementedException(); } }
那麼問題了,這裡只新增了鷹,只需要實現fly的方法就可以的,但由於在animal介面上進行了修改,dog和cat類也要進行相應的變更,去實現一個無效的介面方法。由於每一個實現類都依賴了它們不需要的介面,使得層與層之間的耦合度增加,導致了不需要的介面修改時,實現類也不得不跟著修改。
根據介面隔離原則,對上面的設計進行修改,將動物animal設計成兩個介面。
//哺乳動物 public interface Mammal { void Run(); } //鳥類 public interface Bird { void Fly(); }
然後不同的類去實現不同的介面。
public class Dog : Mammal { public void Run() { Console.WriteLine("dog run"); } } public class Cat : Mammal { public void Run() { Console.WriteLine("cat run"); } } public class Eagle : Bird { public void Fly() { Console.WriteLine("eagle fly"); } }
這樣,不同的類就只需要實現自己所需要的方法,如果要新增其它動物,只需要在對應的介面和實現類上進行修改就行。這樣設計,降低了介面的耦合度,可以看出介面隔離原則的必要性。