設計模式:接口隔離原則

官方定義

接口隔離原則(Interface Segregation Principe),又稱爲ISP原則,官方定義爲:java

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

客戶端不該該依賴它不須要的接口ui

二、The dependency of one class to another one should depend on the smallest possible interface設計

類間的依賴關係應該創建在最小的接口上code

基本介紹

通俗的來說,不要在一個接口裏面定義過多的方法,接口應該最細化接口

案例演示-市場風雲

​ 假設有這樣一個案例場景,如今有一個接口knife,給定他有三個能力,能夠切蘋果,切番茄,切土豆,兩個類張廚師,李廚師分別具備這些能力,有一個水果店類,假設是須要張師傅來切蘋果和切番茄,而另外一個蔬菜店類須要李師傅來切番茄和切土豆ip

//定義接口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());
    }
}

案例分析

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

違反了類間的依賴關係應該創建在最小的接口上這個原則get

解決方案

//將揭開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());
    }
}

案例總結

接口隔離原則就是當我一個類經過接口依賴(使用)另外一個類的時候,要保證依賴的該接口是最小的,接口裏面用不到的,就進行隔離,而隔離的作法就是,就對原來的接口進行拆分,拆分爲最小粒度,來避免耦合。it

與單一職責原則對比

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

接口隔離原則:類間的依賴關係應該創建在最小的接口上

相同點

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

不一樣點

審視的角度不一樣

單一職責原則:類與接口職責單一,注重的是職責

接口隔離原則:要求咱們儘可能使用多個專門的接口,注重的是接口的設計

咱們使用接口隔離原則進行接口拆分的時候,要遵循單一職責原則

相關文章
相關標籤/搜索