文章目录
- 一、接口隔离原则简介
- 二、接口隔离原则代码示例 ( 反面示例 )
- 1、接口定义 ( 接口臃肿 )
- 2、实现类 1
- 3、实现类 2
- 三、接口隔离原则代码示例 ( 推荐用法 )
- 1、接口 1
- 2、接口 2
- 3、接口 3
- 4、接口 4
- 5、实现类
一、接口隔离原则简介
接口隔离原则 : 用 多个 专门的 接口 , 不使用 单一 的总接口 , 客户端 不应该依赖 它 不需要的 接口 ;
一个类 对 另一个类 的依赖 , 应该建立在 最小接口 上 ; 如果 有一个 大接口 , 里面有 很多方法 , 如果使用一个类 实现该接口 , 所有的类都要实现 ;
建立 功能 单一接口 , 不要建立 庞大 臃肿 的接口 ;
尽量细化接口 , 接口中的方法尽量少 ;
接口设计适度原则 : 接口隔离原则 中 最重要的就是 注意 适度原则 , 一定要适度 ;
接口设计的 过大 , 过小 , 都不合适 ; 设计接口时 , 多花时间去思考策划 ;
接口方法 尽量少 , 但要有限度 , 对接口进行细化 , 肯定能 提高系统设计的灵活性 , 但是如果 接口设计的过小 , 方法过少 , 则会 造成接口数量过多 , 提高整个程序设计的复杂性 ;
接口隔离原则 优点 : 符合 高内聚 , 低耦合 的 设计思想 , 使得类具有很好的 可读性 , 可扩展性 , 可维护性 ;
- 降低耦合 : 平时设计接口时 , 只暴露客户端需要的方法 , 客户端不需要的方法 , 直接隐藏起来 ; 只有专注的为一个模块提供定制服务 , 才能 建立最小的依赖关系 , 这样就降低了耦合程度 ;
- 提高内聚 : 减少对外交互 , 使用接口中最少的方法 , 完成最多的事情 ;
实际开发中 , 实践接口隔离原则时 , 也要根据业务场景 , 业务模型 , 以及以后有可能会发生变更的地方 , 对于这些做一些预判 , 抽象出业务模型很重要 ;
二、接口隔离原则代码示例 ( 反面示例 )
1、接口定义 ( 接口臃肿 )
代码语言:javascript复制package interfacesegregation;
/**
* 动物行为接口
* 该接口中声明的方法过多 , 方法分属于不同的类型
* 该接口可以进一步细化
*/
public interface IAnimationAction {
void eat();
void fly();
void walk();
void swim();
}
2、实现类 1
代码语言:javascript复制package interfacesegregation;
/**
* 定义 Dog 类 , 实现 IAnimationAction 接口
* 需要实现该接口下的所有方法
* 很明显狗不能飞 , fly 方法只能空着 , 没有实际意义
*/
public class Dog implements IAnimationAction {
@Override
public void eat() {
}
@Override
public void fly() {
}
@Override
public void walk() {
}
@Override
public void swim() {
}
}
3、实现类 2
代码语言:javascript复制package interfacesegregation;
/**
* 定义 Bird 类 , 实现 IAnimationAction 接口
* 需要实现该接口下的所有方法
* 很明显鸟不能游泳 , swim 方法只能空着 , 没有实际意义
*/
public class Bird implements IAnimationAction {
@Override
public void eat() {
}
@Override
public void fly() {
}
@Override
public void walk() {
}
@Override
public void swim() {
}
}
三、接口隔离原则代码示例 ( 推荐用法 )
1、接口 1
代码语言:javascript复制package interfacesegregation;
public interface IEatAnimalAction {
void eat();
}
2、接口 2
代码语言:javascript复制package interfacesegregation;
public interface IFlyAnimalAction {
void fly();
}
3、接口 3
代码语言:javascript复制package interfacesegregation;
public interface ISwimAnimalAction {
void swim();
}
4、接口 4
代码语言:javascript复制package interfacesegregation;
public interface IWalkAnimalAction {
void walk();
}
5、实现类
代码语言:javascript复制package interfacesegregation;
/**
* 狗可以 吃 / 走路 / 游泳
* 这里直接继承 3 个对应的接口
* 并实现接口中的方法
*
* 细粒度接口可以组装 , 粗粒度接口无法拆分
*/
public class Dog implements IEatAnimalAction,
IWalkAnimalAction,
ISwimAnimalAction {
@Override
public void eat() {
}
@Override
public void swim() {
}
@Override
public void walk() {
}
}