接口隔离要求定义小而专的契约以解耦依赖,如拆分iuserservice为iauthenticator、iorderservice、ilogsink;依赖倒置强调高层模块依赖抽象接口而非具体实现;组合优于继承,通过接口聚合实现能力复用;接口演进应新增版本而非修改旧接口。

接口隔离是面向对象设计中解耦模块依赖的核心手段——它不靠“减少调用”,而是靠“定义清晰、窄而专的契约”来切断不必要的依赖。
接口要小而专注,拒绝“万能接口”
一个接口不应包含多个不相关的功能方法。比如把 用户登录、订单创建、日志上报 全塞进一个 IUserService 里,会导致调用方被迫依赖它根本不用的能力,也阻碍单独替换某项实现。
- 拆成
IAuthenticator(只含 login/logout)、IOrderService(只含 create/cancel)、ILogSink(只含 write/error) - 每个模块只声明自己真正需要的接口类型,而非具体类或大接口
- IDE 中 Ctrl+Click 能直接跳到契约定义,而不是一堆无关方法中找关键逻辑
依赖倒置:高层模块不依赖低层实现,而依赖抽象接口
业务服务类(如 PaymentProcessor)不该 new 出 AlipayClient 或 WechatPayClient,而应接收一个 IPaymentGateway 接口实例。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 构造函数注入或 setter 注入接口,运行时由容器(Spring)或工厂提供具体实现
- 测试时可轻松传入
MockPaymentGateway,无需启动真实支付通道 - 更换支付渠道只需新增实现类 + 修改配置,原有业务代码零改动
组合优于继承,用接口聚合替代类继承链
避免为复用行为而拉长继承树(如 User → AdminUser → SuperAdminUser),这会把所有子类绑死在父类的全部接口上。
- 提取能力为接口:
IExportable、IEditable、IApprovable - 具体角色类通过字段持有这些接口实现,按需组合:“管理员”可同时持
IEditable和IApprovable,但不继承任何带冗余方法的基类 - 后续新增“审计员”只需实现
IExportable,完全不沾其他能力的代码
接口即契约:版本演进时用新接口代替修改旧接口
当需求变化要求增加参数或调整语义,不要往已有接口加方法或改签名——这会破坏所有实现类和调用方。
- 新增
IOrderServiceV2,保留原IOrderService给存量系统继续用 - 通过适配器模式让老实现兼容新接口(或反之),过渡期并存
- Gradle/Maven 中可将不同版本接口打包进不同 artifact,强制模块声明明确依赖
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










