1. 程式人生 > 實用技巧 >C# 設計原則-介面隔離原則

C# 設計原則-介面隔離原則

  介面隔離原則,全稱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");
    }
}

  這樣,不同的類就只需要實現自己所需要的方法,如果要新增其它動物,只需要在對應的介面和實現類上進行修改就行。這樣設計,降低了介面的耦合度,可以看出介面隔離原則的必要性。