在Java项目里,接口不只是语法层面的abstract方法集合,更是一种约束模块之间协作方式的契约。采用接口驱动开发,可以先把系统需要的能力定义成接口,再让不同实现去适配具体场景,从而降低耦合度。

为什么要在Java里正确使用接口
当上层代码直接依赖具体类时,一旦底层实现变更,调用方也得跟着改。使用接口后,调用方只认行为不认实现,替换或新增实现都不会影响原有逻辑。
- 解耦:模块之间通过接口通信,不绑定具体类
- 易测:单元测试可用假实现替代真实依赖
- 可扩:新增实现无需修改消费端代码
接口驱动开发的常见设计模式
1. 策略模式配合接口
把可变算法抽象成接口,运行时注入不同实现。下面定义一个支付接口及其两种实现:
// 支付接口
public interface PaymentService {
boolean pay(String orderId, double amount);
}
// 支付宝实现
public class AlipayService implements PaymentService {
public boolean pay(String orderId, double amount) {
System.out.println("支付宝支付: " + orderId);
return true;
}
}
// 微信实现
public class WechatService implements PaymentService {
public boolean pay(String orderId, double amount) {
System.out.println("微信支付: " + orderId);
return true;
}
}
2. 工厂模式创建接口实例
消费端不需要知道实现类,由工厂按类型返回接口:
public class PaymentFactory {
public static PaymentService getService(String type) {
if ("alipay".equals(type)) {
return new AlipayService();
} else if ("wechat".equals(type)) {
return new WechatService();
}
throw new IllegalArgumentException("未知支付类型");
}
}
分层架构中接口的位置
在典型JavaWeb项目中,建议把业务接口放在service层包内,例如UserService接口与UserServiceImpl实现分开。Controller依赖接口而非实现类,Spring通过注入完成绑定。
| 层级 | 接口职责 |
|---|---|
| api/controller | 调用service接口,不感知实现 |
| service | 定义业务接口与多个实现 |
| dao | 数据访问接口隔离数据库细节 |
使用接口的注意点
接口数量不是越多越好,仅在有真正变化点或需解耦的地方抽象接口,避免过度设计。
另外,接口方法命名应表达意图,如saveOrder()而不是doThing()。如果实现类只在单一处使用且无扩展可能,直接写类也可以。
小结
在Java项目里正确使用接口,核心是先定义契约、后写实现,并借助策略、工厂等模式让系统面向抽象编程。这样在需求变动时,只需新增实现并调整注入,不必改动调用链。