依赖倒转原则_玩转设计模式:深入学习“依赖倒转原则”

先赞再看,养成习惯。

58cd8b721e51a59fa94439e413ac55e4.png

闲话少说,直入正题。今天由菜鸟给大家分享一下设计模式七大原则中的依赖倒转原则

设计理念

1、上层模块不应该依赖下层模块,两者都应该依赖其抽象。

2、抽象不应该依赖细节,细节应该依赖抽象。

通过上面的两点我们不难发现,其实依赖倒转原则的核心思想就是“面向抽象”编程。这里的抽象可以是“接口”也可以是“抽象类”。

倒转的体现

3c62511589525ed47e6b455e32b92ebf.png

打个比方,现在有一个出售水果的水果店系统需要开发。正常逻辑思考,第一步考虑是需要先有一个店,然后进一步考虑,要出售各种各样的水果。

用编程的术语来描述,此时的水果店就是上层模块,各种各样的水果就是下层模块。按上面的文字描述,我们可以将水果和水果店之间的依赖关系理解成下图。

8002366d7236560f3bf7c5a29e21016e.png

按照以上描述我们编写代码。

未进行倒转的代码:

public class Test {  public static void main(String[] args) {    FruitShop fruitShop = new FruitShop();    fruitShop.salesApple(new Apple());    fruitShop.salesBanana(new Banana());    fruitShop.salesWatermelon(new Watermelon());    fruitShop.salesPeach(new Peach());  }}// 水果店class FruitShop {  // 出售苹果  public void salesApple(Apple apple) {    System.out.println(apple.sales());  }  // 出售香蕉  public void salesBanana(Banana banana) {    System.out.println(banana.sales());  }  // 出售西瓜  public void salesWatermelon(Watermelon watermelon) {    System.out.println(watermelon.sales());  }  // 出售桃子  public void salesPeach(Peach peach) {    System.out.println(peach.sales());  }}// 苹果class Apple {  public String sales() {    return "卖出一斤苹果!";  }}// 香蕉class Banana {  public String sales() {    return "卖出一斤香蕉!";  }}// 西瓜class Watermelon {  public String sales() {    return "卖出一斤西瓜!";  }}// 桃子class Peach {  public String sales() {    return "卖出一斤桃子!";  }}

这样设计的程序比较容易理解,从上至下依次进行。但是它有一个巨大的缺点就是上层模块依赖于每一个下层模块,当下层模块变更时,会直接影响到上层。这是有问题的,作为一个水果店,我们肯定不会因为今天没有苹果了,就不再进行营业了对吧?

为此我们可以将一开始的想法“倒转”,从下层的水果开始思考,比如现在有苹果、香蕉、西瓜、等等……为了方便管理这些水果,我们可以抽象出一个“水果”接口(或抽象类)。然后让各类水果都依赖于这个接口,再让我们的水果店也依赖于这个接口。

其依赖关系如下图:

c2a7159ebe2e801480857a9b9a22090b.png

根据以上描述将之前的示例代码作出如下优化。

依赖倒转后的代码:

public class Test {  public static void main(String[] args) {    FruitShop fruitShop = new FruitShop();    fruitShop.salesFruit(new Apple());    fruitShop.salesFruit(new Banana());    fruitShop.salesFruit(new Watermelon());    fruitShop.salesFruit(new Peach());  }}// 水果店class FruitShop {  // 出售水果  public void salesFruit(Fruits fruits) {    System.out.println(fruits.sales());  }}// 抽象出的水果接口interface Fruits {  // 方法  String sales();}// 苹果class Apple implements Fruits {  @Override  public String sales() {    return "卖出一斤苹果!";  }}// 香蕉class Banana implements Fruits {  @Override  public String sales() {    return "卖出一斤香蕉!";  }}// 西瓜class Watermelon implements Fruits {  @Override  public String sales() {    return "卖出一斤西瓜!";  }}// 桃子class Peach implements Fruits {  @Override  public String sales() {    return "卖出一斤桃子!";  }}

讲了这么多,那依赖倒转到底有什么用那,或者说使用它有什么好处那?大家能通过上面的描述有一个自己的理解吗?

667a7a1452dac648e6eb15edb0cb1102.png

菜鸟认为依赖倒转有如下优点

1、可以提高程序的稳定性。

2、有利于程序的扩展和优化。

以上就是今天跟大家分享的内容。如果文章哪里写的有问题的希望大家可以在评论区提出来,菜鸟会积修改。感觉文章写的还不错的记得点赞加关注呦!

了解更多精彩内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值