本文已参加「新人创作礼」活动,一起开启掘金创作之路。
定义
- 客户端不应该依赖它不需要的接口。
- 一个类对另一个类的依赖应该建立在最小的接口上。
实际上就是要求接口细化。
代码实现
不使用接口隔离原则
定义一个猫猫接口
/**
* @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 "是的,我能捕老鼠";
}
}
这样细粒度的接口划分就完成了,它们可以根据具体情况实现不同的接口。