Java七大设计原则(5/7)——接口隔离原则

172 阅读2分钟

本文已参加「新人创作礼」活动,一起开启掘金创作之路。

定义

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

实际上就是要求接口细化


代码实现

不使用接口隔离原则

定义一个猫猫接口

/**
 * @author John117
 * @date 2022/05/23  18:24
 */
public interface Cat {
    String getName();
    
    String getMiao();
    
    String eatMouse();
}

定义一个橘猫,实现Cat接口

/**
 * @author John117
 * @date 2022/05/23  18:28
 */
public class OrangeCat implements Cat{

    @Override
    public String getName() {
        return "我是大橘";
    }

    @Override
    public String getMiao() {
        return "我会喵喵叫";
    }

    @Override
    public String eatMouse() {
        return "是的,我能捕老鼠";
    }
}

定义一个Tiger类,实现Cat接口。大猫也是猫

/**
 * @author John117
 * @date 2022/05/23  18:30
 */
public class Tiger implements Cat{
    @Override
    public String getName() {
        return "我是虎哥";
    }
	// 大猫不会miaomiao叫
    @Override
    public String getMiao() {
        return null;
    }

	// 大猫也不会吃老鼠
    @Override
    public String eatMouse() {
        return null;
    }
}

这时候发现问题了没,我们再看一下接口隔离原则定义

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

由于接口细化程度不够,虽然大猫也是猫科动物,但是确实不适合Cat接口所定义的方法,大猫只可以咆哮,也不会捕老鼠。

所以这里可以将Cat接口进行更细粒的划分。

使用接口隔离原则

这里将Cat分成BigCat和SmallCat两个接口,使其分别适应Tiger和OrangeCat的不同行为。

/**
 * @author John117
 * @date 2022/05/23  18:31
 */
public interface BigCat {
    String getName();
    Boolean isLiveWild();
}
/**
 * @author John117
 * @date 2022/05/23  18:31
 */
public interface SmallCat {
    String getName();
    String getMiao();
    String eatMouse();
}

再分别实现

/**
 * @author John117
 * @date 2022/05/23  18:33
 */
public class Tiger implements BigCat{
    @Override
    public String getName() {
        return "我是虎哥";
    }

    @Override
    public Boolean isLiveWild() {
        return true;
    }
}
/**
 * @author John117
 * @date 2022/05/23  18:33
 */
public class OrangeCat implements Cat {

    @Override
    public String getName() {
        return "我是大橘";
    }

    @Override
    public String getMiao() {
        return "我会喵喵叫";
    }

    @Override
    public String eatMouse() {
        return "是的,我能捕老鼠";
    }
}

这样细粒度的接口划分就完成了,它们可以根据具体情况实现不同的接口。