国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

深度解讀架構(gòu)設(shè)計(jì)中的依賴反轉(zhuǎn)原則

開發(fā) 前端
通過一個(gè)小場(chǎng)景探討了傳統(tǒng)架構(gòu)設(shè)計(jì)中存在的不足,以及如何基于依賴反轉(zhuǎn)原則來對(duì)其進(jìn)行改進(jìn)。最后,我們基于Java代碼示例來展示了如何在代碼級(jí)別來實(shí)施依賴反轉(zhuǎn)原則。

在日常工作中,總是聽大家說使用依賴反轉(zhuǎn)原則可以很好地讓業(yè)務(wù)領(lǐng)域?qū)优c基礎(chǔ)設(shè)施或框架層進(jìn)行解耦。即使基礎(chǔ)設(shè)施發(fā)生變動(dòng),也不會(huì)影響業(yè)務(wù)領(lǐng)域代碼。那么架構(gòu)中所說的依賴反轉(zhuǎn)原則到底是什么呢?在寫代碼時(shí),我們又該如何實(shí)施呢?這節(jié)課,我們就來一探究竟。

DIP 原則是什么?

首先,我們來看下架構(gòu)中的依賴反轉(zhuǎn)原則是什么。根據(jù)維基百科的描述,依賴反轉(zhuǎn)原則(Dependency inversion principle,DIP)是指一種模塊解耦的實(shí)現(xiàn)思想,它使得高層次的模塊不依賴于低層次的模塊的實(shí)現(xiàn)細(xì)節(jié),從而使得低層次模塊依賴于高層次模塊的抽象。

這一原則的核心思想有如下兩點(diǎn):

  • 高層次的模塊不應(yīng)該依賴于低層次的模塊,兩者都應(yīng)該依賴于 抽象接口;
  • 抽象接口不應(yīng)該依賴于具體實(shí)現(xiàn),而具體實(shí)現(xiàn)則應(yīng)該依賴于抽象接口。

接下來,我們通過一個(gè)例子來深入理解一下這兩點(diǎn)思想。

當(dāng)Application模塊需要使用Service模塊提供的服務(wù)時(shí),傳統(tǒng)架構(gòu)上的設(shè)計(jì)是在Service模塊中定義ComputeService接口以及它的實(shí)現(xiàn)類ComputeServiceImpl。

這時(shí)Application模塊要想使用Service模塊的ComputeService服務(wù),就需要在Application模塊內(nèi)引入Service模塊,具體來說,在Java中是需要在Application模塊的POM文件里引入Service模塊的Maven倉庫坐標(biāo),然后Application模塊就可以引用到Service模塊的服務(wù)了。

圖片

設(shè)計(jì)完畢后,我們會(huì)得到兩個(gè)意義上的依賴關(guān)系。首先,從控制流上(代碼運(yùn)行時(shí)代碼的執(zhí)行時(shí)序上),Application模塊會(huì)依賴Service模塊;其次,代碼依賴上,Application模塊也會(huì)依賴Service模塊。

由于這種設(shè)計(jì)會(huì)導(dǎo)致Application模塊在源碼上就依賴了Service模塊,所以當(dāng)Service模塊修改、發(fā)布時(shí),Application模塊也需要修改和重新編譯,這顯然不是我們想要的。

而在采用DIP原則的情況下,相同場(chǎng)景下的設(shè)計(jì)如下圖:

圖片

如圖可知,我們把Application模塊所需的ComputeService接口定義到了Application模塊內(nèi)部,而ComputeService接口的具體實(shí)現(xiàn)類ComputeServiceImpl則放到了Service模塊。由于ComputeServiceImpl類需要實(shí)現(xiàn)ComputeService接口,所以Service模塊必須在源碼上依賴Application模塊。在Java中則體現(xiàn)為Service模塊的POM文件中要添加Application模塊的maven倉庫坐標(biāo),以及ComputeServiceImpl類要使用Application模塊的ComputeService接口代碼。

在基于DIP原則設(shè)計(jì)完畢后,我們也會(huì)得到兩個(gè)意義上的依賴關(guān)系。首先,從控制流上,Application模塊還是會(huì)依賴Service模塊;從代碼依賴上看,Service模塊也依賴Application模塊了。這體現(xiàn)了抽象接口(ComputeService)不應(yīng)該依賴于具體實(shí)現(xiàn)(ComputeServiceImpl),而具體實(shí)現(xiàn)類(ComputeServiceImpl)則應(yīng)該依賴于抽象接口(ComputeService)。另外,這里控制流上的依賴與源碼的依賴關(guān)系是相反的,所以叫做依賴反轉(zhuǎn)。

使用DIP原則,當(dāng)?shù)蛯哟蜸ervice模塊的ComputeServiceImpl類發(fā)生改動(dòng)時(shí),我們可以保證只需要修改和編譯Service模塊就可以了,Application模塊并不會(huì)受到影響。當(dāng)然如果ComputeService接口本身定義發(fā)生變化了,還是需要Application模塊進(jìn)行修改的。因此,請(qǐng)注意,使用DIP原則的前提也是接口是穩(wěn)定的情況下進(jìn)行討論的。

如何在代碼層面來實(shí)踐 DIP 原則?

下面,我們通過一個(gè)代碼示例來看看如何在實(shí)踐上基于DIP原則實(shí)現(xiàn)上面的場(chǎng)景。

圖片

這個(gè)Demo分為三個(gè)模塊,其中Application模塊、Service模塊分別對(duì)應(yīng)我們前面一直講解的兩個(gè)模塊,Main模塊的作用是用來提供main函數(shù)入口,用來把Application模塊和Service模塊的功能串起來,實(shí)現(xiàn)一個(gè)可執(zhí)行的程序。

三個(gè)模塊之間的依賴關(guān)系如下圖:

圖片

首先,我們來看下Application模塊的內(nèi)容。

圖片

可以看到,Application模塊下有兩個(gè)類,其中ComputeService接口定義為:

public interface ComputeService {
  int add(int a, int b);
}

ApplicationService的代碼如下:

public class ApplicationService {
  private ComputeService computeService;
  public ApplicationService(ComputeService computeService) {
    this.computeService = computeService;
  }
  public int add(int a, int b) {
    return computeService.add(a, b);
  }
}

ApplicationService服務(wù)依賴了ComputeService接口來具體實(shí)現(xiàn)add操作,這里ComputeService接口就是抽象接口。后面我們會(huì)講到,無論Application模塊還是Service模塊,都只會(huì)依賴ComputeService這個(gè)抽象接口。

我們?cè)?Application模塊目錄下執(zhí)行mvn clean install命令,就可以把Application模塊安裝到本地Maven倉庫,然后其他模塊就可以通過它的Maven坐標(biāo)引用這個(gè)服務(wù)了。

<dependency>
  <groupId>org.example</groupId>
  <artifactId>Application</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
</dependency>

然后我們看下Service模塊的內(nèi)容。

圖片

Service模塊下只包含ComputeServiceImpl一個(gè)類,它的代碼內(nèi)容如下:

public class ComputeServiceImpl implements ComputeService {
  @Override
  public int add(int a, int b) {
    return a + b;
  }
}

可以看到,ComputeServiceImpl類實(shí)現(xiàn)了ComputeService抽象接口。由于ComputeServiceImpl類依賴ComputeService接口的源碼,所以我們需要在Service模塊的POM文件里面添加Application模塊的依賴,也就是添加下面的Maven坐標(biāo):

<dependency>
  <groupId>org.example</groupId>
  <artifactId>Application</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
</dependency>

ComputeServiceImpl類的實(shí)現(xiàn)比較簡(jiǎn)單,就是簡(jiǎn)單計(jì)算加法,然后返回結(jié)果。這里我們需要知道的是,因?yàn)镃omputeService接口的定義在Application模塊,所以Service模塊在源碼上就依賴了Application模塊。最后在Service模塊的目錄下執(zhí)行mvn clean install 命令就可以把Service模塊安裝到本地Maven倉庫,然后其他模塊就可以通過其Maven坐標(biāo)引用這個(gè)服務(wù)了。

<dependency>
  <groupId>org.example</groupId>
  <artifactId>Service</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

下面,我們?cè)倏碝ain模塊的內(nèi)容。

圖片

Main模塊內(nèi)就含有一個(gè)叫做Main的類,對(duì)應(yīng)代碼如下:

public class Main {
  public static void main(String[] args) {
    //1. 創(chuàng)建計(jì)算服務(wù)
    ComputeService computeService = new ComputeServiceImpl();
    //2. 創(chuàng)建應(yīng)用服務(wù)
    ApplicationService applicationService = new ApplicationService(computeService);
    //3. 執(zhí)行計(jì)算,并輸出結(jié)果
    int result = applicationService.add(1,2);
    System.out.println(result);
  }
}

代碼1創(chuàng)建了一個(gè)ComputeServiceImpl服務(wù)的實(shí)例,由于ComputeServiceImpl的實(shí)現(xiàn)在Service模塊里,所以我們需要在Main組件的POM文件里,填寫下面的Maven坐標(biāo):

<dependency>
  <groupId>org.example</groupId>
  <artifactId>Service</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

代碼2則創(chuàng)建了一個(gè)ApplicationService實(shí)例,并且把代碼1創(chuàng)建的ComputeServiceImpl實(shí)例作為參數(shù)。這里我們需要注意的是,ApplicationService的構(gòu)造函數(shù)的入?yún)镃omputeService接口,而不是ComputeServiceImpl。這體現(xiàn)了高層次的Application模塊不應(yīng)該依賴于低層次的Service模塊(ComputeServiceImpl類),兩者都應(yīng)該依賴于 抽象接口(ComputeService)。

另外,代碼2由于依賴ApplicationService的源碼,所以Main組件還是需要依賴Application模塊,這就需要在Main組件的POM文件中,添加Application模塊的Maven坐標(biāo):

<dependency>
  <groupId>org.example</groupId>
  <artifactId>Application</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
</dependency>

代碼3就比較簡(jiǎn)單了,我們直接調(diào)用Application模塊的ApplicationService的add方法執(zhí)行計(jì)算。調(diào)用ApplicationService的add方法后,add方法內(nèi)部則會(huì)調(diào)用Service模塊的ComputeServiceImpl類的add方法執(zhí)行具體計(jì)算操作。

總結(jié)

這次我們先學(xué)習(xí)了什么是依賴反轉(zhuǎn)原則。然后,通過一個(gè)小場(chǎng)景探討了傳統(tǒng)架構(gòu)設(shè)計(jì)中存在的不足,以及如何基于依賴反轉(zhuǎn)原則來對(duì)其進(jìn)行改進(jìn)。最后,我們基于Java代碼示例來展示了如何在代碼級(jí)別來實(shí)施依賴反轉(zhuǎn)原則。

責(zé)任編輯:武曉燕 來源: 程序猿技術(shù)充電站
相關(guān)推薦

2021-05-07 15:27:23

架構(gòu)設(shè)計(jì)架構(gòu)開發(fā)

2015-10-29 10:50:46

Android架構(gòu)設(shè)計(jì)原則

2023-07-09 15:24:05

架構(gòu)設(shè)計(jì)思想AKF

2021-11-01 21:01:01

架構(gòu)設(shè)計(jì)軟件

2012-05-11 10:38:15

Cloud Found

2023-05-12 07:52:13

架構(gòu)設(shè)計(jì)設(shè)計(jì)原則

2024-08-16 14:01:00

2024-05-10 07:19:46

IOC依賴倒置控制反轉(zhuǎn)

2024-09-09 09:00:12

架構(gòu)設(shè)計(jì)算法

2009-07-06 10:36:41

敏捷開發(fā)

2024-09-19 08:46:46

SPIAPI接口

2023-07-17 15:09:08

SaaS架構(gòu)平臺(tái)

2017-05-17 14:51:31

DNS架構(gòu)負(fù)載均衡

2012-03-07 10:40:19

Java設(shè)計(jì)模式

2025-06-27 09:24:38

MCP服務(wù)器系統(tǒng)

2025-04-15 04:00:00

2022-12-30 08:16:34

2020-08-27 14:22:29

MySQL數(shù)據(jù)庫架構(gòu)設(shè)計(jì)

2013-09-02 17:53:41

MVC架構(gòu)設(shè)計(jì)MEF

2022-03-29 15:10:22

架構(gòu)設(shè)計(jì)模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亲子乱一区二区三区电影 | 欧美一区观看| 男人久久天堂| 成人午夜精品在线| 成人免费观看a| www.91精品| 欧美一区二视频| 日本粉色视频在线观看| 国产盗摄精品一区二区三区在线 | www欧美成人18+| 欧美日韩国产高清视频| 美女毛片一区二区三区四区| 亚洲免费av电影| 国产日本在线| 亚洲视频在线一区二区| www成人免费| 日韩国产欧美三级| 91丝袜脚交足在线播放| 婷婷精品视频| 久久亚洲国产精品| 丝袜诱惑一区二区| 7777精品伊人久久久大香线蕉经典版下载| av成人网在线| 国产日韩欧美综合一区| 久久人人爽人人爽人人av| 男人的天堂亚洲一区| 国产欧美日韩一区| 亚洲女同中文字幕| 成人国产精品免费视频| 一呦二呦三呦国产精品| 欧美精品18videos性欧| 亚洲伊人精品酒店| 中文字幕亚洲欧美在线| 亚洲高清黄色| 亚洲色图日韩av| а√天堂8资源在线| 91精品国产一区二区三区蜜臀| 头脑特工队2在线播放| 精品久久久久久国产| 色琪琪丁香婷婷综合久久| 亚洲欧美欧美一区二区三区| 成人免费乱码大片a毛片软件| www日韩大片| 亚洲第一狼人区| 国产精品免费免费| ·天天天天操| 亚洲一区二区三区四区的| 亚洲永久精品免费| 欧美午夜电影在线| 在线观看精品一区二区三区| 91精品综合久久久久久| 99re6在线精品视频免费播放| 亚洲精品suv精品一区二区| 忘忧草在线影院两性视频| 亚洲欧美中文在线视频| 亚洲黑人在线| 性欧美xxxx交| 精品一区二区三区在线 | heyzo久久| 国产在线视频不卡| 国产综合自拍| 欧美亚洲免费高清在线观看 | 啊啊啊啊啊好爽| 亚洲h精品动漫在线观看| 日本一区高清| 在线不卡免费欧美| 亚洲妇女成熟| 九九热99久久久国产盗摄| 亚洲人成精品久久久 | 免费a级人成a大片在线观看| 欧美电影影音先锋| 伊人久久综合一区二区| 欧美成人免费播放| 国产亚洲电影| 国产一区二区高清视频| 韩国一区二区三区| 免费看国产黄色片| 在线视频你懂得一区| 成人免费网站观看| 国内偷自视频区视频综合| 欧美成人有码| 欧美 日韩 国产精品| 亚洲免费观看视频| 国精产品一区| 久久91亚洲精品中文字幕奶水 | 亚洲一区二区久久| 日韩理论电影中文字幕| 国产日韩欧美精品| 91免费版在线| 青青草超碰在线| 日韩理论片久久| 在线成人动漫av| 五月天亚洲综合| 亚洲色图视频网| 国产二区三区在线| 欧美精品一区在线播放| 国产精品v欧美精品v日本精品动漫| 一区国产精品| 亚洲午夜激情网页| 中文字幕这里只有精品| 国产精品人人做人人爽| 韩国av一区二区| 国产污污在线观看| 国产视频综合在线| 中文字幕乱码亚洲无线精品一区| 国产日本在线播放| 欧美裸体一区二区三区| 国产成人一二| 老汉色影院首页| 在线区一区二视频| 91精品尤物| 中文字幕日韩一区二区三区不卡| 亚洲欧美日韩在线| 国产第一亚洲| 美日韩精品免费| 日韩毛片高清在线播放| 悠悠资源网亚洲青| 国产精品我不卡| 亚洲精品视频一区二区| 欧美a一级片| 亚洲日本japanese丝袜| 欧美视频免费在线| 欧美尿孔扩张虐视频| 国产一线二线三线女| 日韩免费观看高清完整版| 久久久久久久久久久9不雅视频| 天天摸天天碰天天添| 亚洲精品中文字| 久久永久免费| 超碰免费在线| 成人免费午夜电影| 亚洲码国产岛国毛片在线| 国产精品视频一区二区三区综合 | 91久久精品国产91久久性色tv | 国产黄色免费网| 久久精品国产96久久久香蕉| 三级精品在线观看| 免费在线国产| 日本国产精品视频| 中文在线免费一区三区高中清不卡| 性国裸体高清亚洲| 亚洲一区二区三区精品动漫| 欧美日韩精品欧美日韩精品一 | 九九热精品视频国产| 国产麻豆一精品一av一免费| 国产最新在线| 精品国产免费一区二区三区| 色哟哟精品一区| 亚洲破处大片| 全色精品综合影院| 成人综合网网址| 偷拍一区二区三区四区| 日韩精品久久久久久久电影99爱| 91婷婷韩国| 欧美亚洲国产视频| 亚洲伦在线观看| 狠狠做六月爱婷婷综合aⅴ| 亚洲欧美日韩一级| 97视频在线观看网址| 欧美国产禁国产网站cc| 精品入口麻豆88视频| 精品视频免费在线播放| 在线看片第一页欧美| jiyouzz国产精品久久| 色综合久久久| 91淫黄看大片| 77777少妇光屁股久久一区| 国产精品国产自产拍高清av王其| 9999久久久久| 国产美女在线播放| 国产乱码一区| 91麻豆精品国产无毒不卡在线观看| 精品福利av| 少女频道在线观看高清| 蜜桃视频成人在线观看| 久久中文久久字幕| 亚洲视频综合在线| 韩日精品在线| 黄色的视频在线观看| 久久手机在线视频| 国内精品视频在线| 午夜精品影院在线观看| 国产精品久久久久毛片大屁完整版 | 91在线播放视频| 717成人午夜免费福利电影| 日精品一区二区| 偷拍视频一区二区三区| 中国黄色片免费看| 成人91视频| 亚洲欧美精品一区二区| 国产欧美久久久精品影院| 久久人体视频| 成人影院在线播放| 一本久道综合色婷婷五月| 国产精品日韩在线| 日韩欧美国产一二三区| 91视频精品在这里| 影视一区二区| 国产原创一区| 男生女生差差差的视频在线观看|