设计模式7大原则——接口隔离原则解析(含代码示例)

一、定义 

客户端不应该依赖它不需要的接口,即 一个类对另一个类的依赖应该建立在最小的接口 上 。

通俗的来说就是,不要在一个接口里面放很多的方法,这样会显得这个类很臃肿不堪。接口应该尽量细化,一个接口对应一个功能模块,同时接口里面的方法应该尽可能的少,使接口更加轻便灵活。

注意点:

大家不要把接口隔离原则和单一职责原则相弄混。接口隔离原则和单一职责原则的审视角度是不同的,单一职责原则要求类和接口职责单一,注重的是职责,是业务逻辑上的划分,而接口隔离原则要求方法要尽可能的少,是在接口设计上的考虑。

二、案例解析

还是用我们之前说过的娱乐圈举例吧,假设现在有星探1和星探2要找美女明星。他们的评判标准不太一样,星探1觉得:身材好、面容姣好就是美女,星探2觉得气质好的女生就是美女。

下面我们开始写代码

我们定义美女接口,代码如下:

//美女接口
public interface IPettyGirl {
    //要有姣好的面孔
    public void goodLooking();
    //要有好身材
    public void niceFigure();
    //要有气质
    public void greatTemperament();
}

//接口的实现类
public class PettyGirl implements IPettyGirl {
    private String name;

    public PettyGirl(String  name){  
      this.name= name;
    }
  
//脸蛋漂亮
public void goodLooking() {
  System.out.println(this.name + "---脸蛋很漂亮!"); 
}

//气质要好
public void greatTemperament() {
      System.out.println(this.name + "---气质非常好!");
}

//身材要好
public void niceFigure() {
      System.out.println(this.name + "---身材非常棒!");
   }
}

下面我们写出两个星探代码。

//星探的抽象
public abstract class AbstractSearcher {

    protected IPettyGirl pettyGirl;

    public AbstractSearcher(IPettyGirl pettyGirl){
        this.pettyGirl = pettyGirl;
   }
     //搜索美女, 列出美女信息
    public abstract void show();
}

//星探1实现类,他以为身材好、面容姣好就是美女
public class Searcher1 extends AbstractSearcher{

     public Searcher(IPettyGirl pettyGirl){
         super(pettyGirl);
   }

    //展示美女的信息
    public void show(){
        System.out.println("--------美女的信息如下:---------------");
         //展示面容
        super.pettyGirl.goodLooking();
         //展示身材
        super.pettyGirl.niceFigure();
      }
}

//星探1实现类,他以为气质好就是美女
public class Searcher2 extends AbstractSearcher{

     public Searcher(IPettyGirl pettyGirl){
         super(pettyGirl);
   }

    //展示美女的信息
    public void show(){
        System.out.println("--------美女的信息如下:---------------");
          //展示气质
        super.pettyGirl.greatTemperament();
      }
}

//下面是客户端代码
public class Client {
      //搜索并展示美女信息
      public static void main(String[] args) {
      //定义一个美女
      IPettyGirl xiaoMei = new PettyGirl("小美");
      AbstractSearcher searcher1 = new Searcher1(yanYan);
      searcher1.show();
     AbstractSearcher searcher2 = new Searcher2yanYan);
      searcher2.show();
    }
}

写完后,感觉还不错,但是这么设计不是最优代码。IPrettyGirl接口中包含了太多的功能,按照这个接口设计,所有的女人都要实现这三个方法,那所有女人岂不是都是美女?而且Searcher1和Search2二个类也仅仅使用了接口中的部分功能,这就违背了接口隔离原则。下面我们对这个接口拆分一下,代码如下:

public interface IGoodBodyGirl {
     //要有姣好的面孔
     public void goodLooking();
     //要有好身材
     public void niceFigure();
}

public interface IGreatTemperamentGirl {
    //要有气质
    public void greatTemperament();
}
//女孩1:身材,面容,气质都很好
public class PettyGirl1 implements IGoodBodyGirl,IGreatTemperamentGirl {
   ...
     中间实现方法略
   ...
}
   //女孩2:身材,面容很好
public class PettyGirl2 implements IGoodBodyGirl {
   ...
     中间实现方法略
   ...
}

这样设计是不是就灵活多了呢?经过重新设计,程序变得更加灵活,这就是接口隔离原则的强大之处。

PS:注意接口隔离原则的辩证关系

接口设计的粒度越小,系统越灵活,这是不争的事实,但是灵活的同时也带来了结构的复杂化,开发难度的增加,可维护性降低。所以这个度要进行权衡。

好了,就先分享到这里,关注我,java学习不头秃,还为每位粉丝准备了一份全面的资料福利,从面试简历模板大厂面经汇总,大厂内部技术资料互联网高薪必读书单,以及Java面试核心知识点(283页)和Java面试题合集2022年最新版(485页)等等,有需要的可以点下方名片领取

你可能感兴趣的:(java,经验分享,面试,学习,接口隔离原则)