1. Interface Segregation Principle(ISP)——客户端不应被迫依赖其不使用的方法;胖接口拆分案例
解释接口隔离原则(ISP),并给出胖接口拆分的案例?
- ISP 的定义
- 胖接口的问题
- 拆分案例
ISP 指"客户端不应该被迫依赖它不使用的方法"。如果一个接口包含了很多方法,而某个客户端只用到其中一部分,它仍必须实现/依赖整个接口,这会造成不必要的耦合和被迫的空实现。典型例子:一个 Worker 接口有 work() 和 eat(),但 Robot 只 work() 不 eat(),被迫实现空的 eat()。解决方式是拆分接口:Workable 只有 work(),Eatable 只有 eat(),Robot 实现 Workable,Human 实现两者。这样每个客户端只依赖自己真正使用的接口,符合 ISP 也符合 LSP(避免空实现)。
ISP 的核心是"接口的粒度要贴合客户端需求"。胖接口让接口拥有者对客户端过度承诺,也让客户端承担不必要的依赖。按"客户端角色"拆接口,让接口只暴露客户端需要的方法,是 ISP 的落地。
interface Worker { void work(); void eat(); }
class Robot implements Worker { // 被迫实现 eat(),空实现
public void work() {}
public void eat() {} // 空实现,违反 ISP
}
// 拆分后
interface Workable { void work(); }
interface Eatable { void eat(); }
class Robot implements Workable { public void work() {} }