面向接口编程¶
一、是什么¶
依赖接口,不依赖实现:
// 不好
class OrderService {
private WechatPay pay = new WechatPay();
}
// 好
class OrderService {
private Pay pay;
OrderService(Pay pay) { this.pay = pay; }
}
二、为什么¶
- 解耦:换支付方式不用改 OrderService。
- 可测试:Mock 接口。
- 可扩展:新增支付方式实现接口就行。
三、例子¶
interface Pay { void pay(int money); }
class WechatPay implements Pay {}
class AliPay implements Pay {}
class OrderService {
private final Pay pay;
OrderService(Pay pay) { this.pay = pay; }
}
新增银行卡支付:
OrderService 不用改。
四、好处¶
- 开闭原则:对扩展开放,对修改关闭。
- 依赖倒置:依赖抽象,不依赖具体。
- 单元测试:Mock Pay。
五、Java 里的例子¶
- List list = new ArrayList()。
- Map map = new HashMap()。
- Spring 里 @Autowired 接口。
一句话
面向接口 = 依赖抽象,不依赖具体。