面向对象设计-依赖倒置原则

依赖倒置原则(Dependency Inversion Principle,DIP)的表述是指抽象不应到依赖细节;细节应当依赖于抽象。即要面向接口编程,不要针对具体的实现编程,这样可以最大程度降低模块之间的耦合。

深入理解

具体在Java程序代码中,如何理解面向接口编程?其实,简单的讲,就是使用Java接口或抽象类进行变量的类型声明、方法参数的类型声明、方法返回值的类型声明,以及数据类型的转换等,而不应到或尽量避免在这些地方使用具体的Java类型进行声明或类型转换。举个例子,比如订单服务中,会调用(依赖)支付服务以完成订单的支付。此时的订单服务实现类代码中,声明或持有的应该是一个支付服务PayService接口,而不是具体实现类比如Alipay或WeChatPay,所有需要用到支付服务的地方,调用的都是PayService接口变量,即代码中都是接口,等到在运行时才实例化或注入具体的实现类,编写代码时不需要关心具体实现类,也就是面向接口/抽象编程。这样,在应用程序扩展或集成新的支付服务时,原来的订单服务代码可以不需要进行修改任何代码,这样也就符合了开闭原则。

要保证做到遵循依赖倒置原则,一个具体的Java类应当只实现Java接口或抽象类中声明的方法,而不应当给出多余的方法。

代码示例

下面以订单服务调用支付服务为例,看看在具体的代码中如何遵循应用依赖倒置原则。

  • 支付服务接口代码
// 1.支付服务接口
public interface PayService {
    // 提交支付
    void pay();
}
  • 现有的支付服务实现:微信支付服务
// 2.微信支付实现类
public class WeChatPay implements PayService {
    @Override
    public void pay() {
        // TODO 调用微信支付API
    }
}
  • 现有的支付服务实现:支付宝支付服务
// 3.支付宝支付实现类
public class AliPay implements PayService {
    @Override
    public void pay() {
        // TODO 调用支付宝API
    }
}
  • 依赖支付服务的订单服务代码
// 4.1业务方代码:订单服务接口
public interface OrderService {
    void pay();
}

// 4.2订单服务实现类
public class OrderServiceImpl implements OrderService {
    // 依赖支付服务,声明为PayService接口类型
    // 如果这里声明为Alipay,将无法使用WeChatPay,限缩了扩展性
    // 要满足使用WeChatPay,还要修改代码
    private PayService payService;

    // 构造器注入依赖的支付服务,也可以选择使用setter方法
    public OrderServiceImpl(PayService payService){
        this.payService = payService;
    }

    @Override
    public void pay() {
        payService.pay();
    }

    // 5.模拟业务方调用
    public static void main(String[] args) {
         // 假设用户选择了微信支付服务
        PayService payService = new WeChatPay();
        // 通过构造器注入
        OrderService orderService = new OrderServiceImpl(payService);
        orderService.pay();
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值