跳转至

面向接口编程

一、是什么

依赖接口,不依赖实现:

// 不好
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; }
}

新增银行卡支付:

class BankPay implements Pay {}

OrderService 不用改。

四、好处

  • 开闭原则:对扩展开放,对修改关闭。
  • 依赖倒置:依赖抽象,不依赖具体。
  • 单元测试:Mock Pay。

五、Java 里的例子

  • List list = new ArrayList()。
  • Map map = new HashMap()。
  • Spring 里 @Autowired 接口。

一句话

面向接口 = 依赖抽象,不依赖具体。