設計模式:介面隔離原則

呂敬瑛發表於2021-01-23

官方定義

介面隔離原則(Interface Segregation Principe),又稱為ISP原則,官方定義為:

1、Clients should not be forced to depend upon interfaces that they don't use.

客戶端不應該依賴它不需要的介面

2、The dependency of one class to another one should depend on the smallest possible interface

類間的依賴關係應該建立在最小的介面上

基本介紹

通俗的來講,不要在一個介面裡面定義過多的方法,介面應該最細化

案例演示-市場風雲

​ 假設有這樣一個案例場景,現在有一個介面knife,給定他有三個能力,可以切蘋果,切番茄,切土豆,兩個類張廚師,李廚師分別具有這些能力,有一個水果店類,假設是需要張師傅來切蘋果和切番茄,而另一個蔬菜店類需要李師傅來切番茄和切土豆

//定義介面knife
interface knife{
    //切蘋果的能力
    void cutApple();
    
    //切番茄的能力
    void cutTomato();
    
    //切土豆的能力
    void cutPotato();
}

//張廚師類
class CookZhang implements Knife{
    
    @Override
    public void cutApple(){
        System.out.println("張廚師正在切水果");
    }
    
    @Override
    public void cutTomato(){
        System.out.println("張廚師正在切番茄");
    }
    
    @Override
    public void cutPotato(){
        System.out.println("張廚師正在切土豆");
    }
}

//李廚師類
class CookLi implements Knife{
        @Override
    public void cutApple(){
        System.out.println("李廚師正在切水果");
    }
    
    @Override
    public void cutTomato(){
        System.out.println("李廚師正在切番茄");
    }
    
    @Override
    public void cutPotato(){
        System.out.println("李廚師正在切土豆");
    }
}

//水果店類
class FruitShop{
    //定義方法
    public void cutApple(Knife knife){
        knife.cutApple();
    }
    
    public void cutTomato(Knife knife){
        knife.cutTomato();
    }
}

//蔬菜店類
class VegetableShop{
    //定義方法
    public void cutPotato(Knife knife){
        knife.cutPotato();
    }
    
    public void cutTomato(Knife knife){
        knife.cutTomato();
    }
}

public class SegregationDemo{
    public static void main(Stringp[] agrs){
        //水果店類
        new FruitShop.cutApple(new CookZhang());
        new FruitShop.cutTomato(new CookZhang());
        
       //蔬菜店類
        new VegetableShop.cutTomato(new CookLi());
        new VegetableShop.cutPotato(new CookLi());
    }
}

案例分析

上面的寫法違反了介面隔離的原則,張師傅並不需要切土豆,李廚師也不需要切蘋果

違反了類間的依賴關係應該建立在最小的介面上這個原則

解決方案

//將揭開kinfe拆分成三個獨立的介面
interface AppleKnife{
    //切蘋果的能力
    void cutApple();
  
}

interface TomatoKnife{ 
    //切番茄的能力
    void cutTomato();
 }

 interface PotatoKnife{    
    //切土豆的能力
    void cutPotato();
  }

//張廚師類
class CookZhang implements AppleKnife,TomatoKnife{
    
    @Override
    public void cutApple(){
        System.out.println("張廚師正在切水果");
    }
    
    @Override
    public void cutTomato(){
        System.out.println("張廚師正在切番茄");
    }
}

//李廚師類
class CookLi implements TomatoKnife,PotatoKnife{
    @Override
    public void cutTomato(){
        System.out.println("李廚師正在切番茄");
    }
    
    @Override
    public void cutPotato(){
        System.out.println("李廚師正在切土豆");
    }
}

//水果店類
class FruitShop{
    //定義方法
    public void cutApple(AppleKnife knife){
        knife.cutApple();
    }
    
    public void cutTomato(TomatoKnife knife){
        knife.cutTomato();
    }
}

//蔬菜店類
class VegetableShop{
    //定義方法
    public void cutPotato(PotatoKnife knife){
        knife.cutPotato();
    }
    
    public void cutTomato(TomatoKnife knife){
        knife.cutTomato();
    }
}

public class SegregationDemo{
    public static void main(Stringp[] agrs){
        //水果店類
        new FruitShop.cutApple(new CookZhang());
        new FruitShop.cutTomato(new CookZhang());
        
       //蔬菜店類
        new VegetableShop.cutTomato(new CookLi());
        new VegetableShop.cutPotato(new CookLi());
    }
}

案例總結

介面隔離原則就是當我一個類通過介面依賴(使用)另一個類的時候,要保證依賴的該介面是最小的,介面裡面用不到的,就進行隔離,而隔離的做法就是,就對原來的介面進行拆分,拆分為最小粒度,來避免耦合。

與單一職責原則對比

單一職責原則:合理的職責分解,一個類只負責一項職責

介面隔離原則:類間的依賴關係應該建立在最小的介面上

相同點

都要求對結構進行拆分,都要求更小的粒度,都要求減少耦合

不同點

審視的角度不同

單一職責原則:類與介面職責單一,注重的是職責

介面隔離原則:要求我們儘量使用多個專門的介面,注重的是介面的設計

我們使用介面隔離原則進行介面拆分的時候,要遵循單一職責原則

相關文章