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

依賴倒置,究竟什么被倒置了?

系統
本文通過一個電商示例分析了什么是依賴倒置原則,并且提出了依賴倒置的兩種實現風格,通過引入抽象層,可以降低系統的耦合度,提升系統的擴展性和可維護性。

當我們需要某個類A中使用到另外一個類B時,最直接的方式就是在A中直接依賴B,但是,今天我們要講解的主角卻是反其道而行之,它就是依賴倒置原則,那么,什么是依賴倒置原則?這種反向思維可以帶來什么收益?這篇文章就來聊一聊。

什么是依賴倒置?

依賴倒置原則,英文為:Dependency inversion principle(簡稱DIP),也是 Robert C. Martin提出的 SOLID原則中的一種,老規矩,還是先看看作者 Robert C. Martin 對接口依賴倒置原則是如何定義的:

The Dependency Inversion Principle (DIP) states that high-level
modules should not depend on low-level modules; both should 
depend on abstractions. Abstractions should not depend on details.
Details should depend upon abstractions.

通過作者對依賴倒置的定義,可以總結出其核心思想是:高層模塊不應該依賴低層模塊,兩者都應該依賴于抽象。抽象不應該依賴于細節,細節應該取決于抽象。

直接依賴的問題

對于上述依賴倒置的定義,如何理解呢?我們先來看下傳統這種直接依賴會存在什么問題?如下為一張直接依賴的關系圖:

在上圖中,高層組件 ObjectA直接依賴于低層組件 ObjectB,高層組件的重用機會受到限制,因為任何對低層組件的更改都會直接影響高層組件。

為了更好的說明直接依賴的問題,這里以一個真實的電商場景為例進行說明,其中有一個高層模塊 OrderService用于處理訂單,這個高層模塊依賴于一個低層模塊 OrderRepository來存儲和檢索訂單數據。示例代碼如下:

// 高層模塊:OrderService
public class OrderService {
    private MySQLOrderRepository mySQLRepository;

    public OrderService(MySQLRepository mySQLRepository) {
        this.mySQLRepository = mySQLRepository;
    }

    public void createOrder(Order order) {
        // 一些業務邏輯
        mySQLRepository.save(order);
    }
}

// 低層模塊:MySQLRepository
public class MySQLRepository {
    public void save(Order order) {
        // 使用 MySQL數據庫保存訂單
    }
}

在上述例子中,OrderService直接依賴于 OrderRepository,這種設計存在幾個缺點:

  • 緊耦合:如果要把數據庫從 MySQL切換到其他的數據庫,我們需要修改 OrderService,因為它直接依賴于 OrderRepository。
  • 難以測試:在進行單元測試時,我們無法輕松地對 OrderService 進行模擬,因為它直接依賴于具體實現 MySQLRepository。
  • 重用性差:如果在另一個項目中我們需要使用 OrderService 但存儲訂單的方式不同,例如使用文件系統或遠程服務,我們將無法直接重用 OrderService。

那么,對于這些缺點,該如何解決呢?接下來我們將重點講解。

如何實現依賴倒置?

這里提供兩種主流的解決方案。

方案一:引入抽象層

通過低級組件實現高級組件的接口,要求低級組件包依賴于高級組件進行編譯,從而顛倒了傳統的依賴關系,如下圖:

圖1中,高層對象A依賴于底層對象B的實現;圖2中,把高層對象A對底層對象的需求抽象為一個接口A,底層對象B實現了接口A,這就是依賴反轉。

因此,上面的問題我們也可以通過引入一個抽象層 OrderRepository來解耦高層模塊和低層模塊,整個關系圖如下:

通過這種方式,OrderService依賴于 OrderRepository接口而不是具體實現 MySQLRepository。這樣,我們可以輕松替換低層實現而無需修改高層模塊,修改后的代碼如下:

// 高層模塊:OrderService
public class OrderService {
    private OrderRepository orderRepository;

    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    public void placeOrder(Order order) {
        // 一些業務邏輯
        orderRepository.save(order);
    }
}

// 抽象層:OrderRepository接口
public interface OrderRepository {
    void save(Order order);
}

// 低層模塊:MySQLRepository實現
public class MySQLRepository implements OrderRepository {
    public void save(Order order) {
        // 使用MySQL數據庫保存訂單
    }
}

// 另一個低層模塊:PostgreSQLRepository實現
public class PostgreSQLRepository implements OrderRepository {
    public void save(Order order) {
        // 使用PostgreSQL數據庫保存訂單
    }
}

在應用程序中,我們可以靈活選擇使用哪種具體實現,也可以把數據庫的選擇做成配置:

OrderRepository orderRepository = new MySQLRepository(); // 或 new PostgreSQLRepository();
OrderService orderService = new OrderService(orderRepository);

通過這種方式,OrderService變得更具重用性、可測試性更強,并且與具體的存儲實現解耦,滿足依賴倒置原則的要求。

方案二:引入抽象層升級版

盡管方式一也實現了依賴倒置,但是這種實現方式高層組件以及組件是封裝在一個包中,對低層組件的重用會差一些,因此,另一種更靈活的解決方案是將抽象組件提取到一組獨立的包/庫中,如下圖:

因此,上述電商示例的依賴關系會變成下圖:

這種實現方式將每一層分離成自己的封裝,鼓勵任何層的再利用,提供穩健性和移動性。

兩種方案的核心思想都是一樣的,只是在靈活性和組件復用的考慮上略有差異。

依賴倒置的實例

在 Java語言中,使用依賴倒置原則的框架或者技術點有很多,這里列舉2個比較較常用的例子:

1.Spring

Spring框架的核心之一是依賴注入(Dependency Injection, DI),這是依賴倒置原則的一個實現。通過Spring容器管理對象的創建和依賴關系,可以使得高層模塊和低層模塊都依賴于抽象。Spring支持構造器注入、setter注入和接口注入等多種方式。

2.Java SPI

Java SPI(Service Provider Interface)機制也體現了依賴倒置原則,SPI機制通過定義接口和服務提供者(Service Providers),使得高層模塊(使用者)和低層模塊(提供者)之間的依賴關系可以通過接口進行解耦。具體來說,高層模塊依賴于抽象(接口),而不是具體的實現,從而實現了依賴倒置原則。

JDBC(Java Database Connectivity)就是使用 SPI機制來加載和注冊數據庫驅動程序,使得應用程序可以動態地使用不同的數據庫而無需修改代碼。

JDBC SPI的工作原理:

  • 定義服務接口:JDBC API定義了一組接口,如 java.sql.Driver。
  • 實現服務接口:每個數據庫廠商實現這些接口,例如,MySQL的驅動實現了 java.sql.Driver接口。
  • 聲明服務提供者:數據庫驅動的JAR包中包含一個文件,聲明實現類。
  • 加載服務提供者:通過 ServiceLoader或 JDBC API動態加載并實例化驅動實現。

總結

本文通過一個電商示例分析了什么是依賴倒置原則,并且提出了依賴倒置的兩種實現風格,通過引入抽象層,可以降低系統的耦合度,提升系統的擴展性和可維護性。因此,在實際開發中,我們應當始終遵循依賴倒置原則,設計靈活、可擴展的系統架構,從而應對復雜多變的業務需求。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2012-03-07 10:40:19

Java設計模式

2024-05-10 07:19:46

IOC依賴倒置控制反轉

2013-09-02 17:53:41

MVC架構設計MEF

2023-11-05 15:05:15

AI論文

2011-11-30 15:28:32

在線協作系統

2021-03-08 21:44:33

以太坊區塊鏈比特幣

2011-12-31 14:47:10

Web App

2012-08-20 09:35:37

DIP接口

2011-09-07 09:21:01

設計模式

2018-11-06 12:26:14

AI教育人工智能

2024-12-13 08:28:45

設計模式依賴

2021-12-15 23:42:56

Webpack原理實踐

2023-10-28 00:02:55

2017-02-23 07:45:33

科技新聞早報

2023-05-05 18:53:23

數據湖數據倉庫

2013-06-20 11:11:00

程序員經理

2022-07-29 14:25:54

Java李三紅版本升級

2018-12-27 09:10:45

2024-06-18 08:31:33

2024-02-23 08:38:34

AI模型計算機
點贊
收藏

51CTO技術棧公眾號

99久久综合99久久综合网站| 91精品在线麻豆| 日韩精品欧美在线| 日韩欧美视频在线播放| 欧美成人精品激情在线观看| 96av在线| 欧美私人免费视频| 亚洲52av| 黄色一区二区三区| 午夜视频免费在线观看| 国产精品嫩草影院com| 日韩少妇内射免费播放18禁裸乳| 国产真实乱子伦精品视频| 日韩av电影免费观看| 亚洲裸体俱乐部裸体舞表演av| 国产欧美一区二区三区在线看| 伊人久久大香线蕉综合网蜜芽 | 91色国产在线| 国产欧美1区2区3区| 国产精品亚洲a| 久久久久久久久久久电影| 1024精品视频| 国产亚洲短视频| 国内外成人免费在线视频| 国产偷国产偷精品高清尤物| 精品久久久久久久无码| 久久久精品tv| heyzo视频在线播放| 亚洲丝袜制服诱惑| 羞羞网站免费观看| 精品久久久久久久久久国产 | 成人国产精品一区二区| 香港欧美日韩三级黄色一级电影网站| 国产精品久久久久高潮| 久久中文字幕二区| 国产欧美韩日| 日韩电影免费在线看| 最新中文字幕久久| 99热在这里有精品免费| 男女男精品视频站| 亚洲成av人片| 亚洲色图第一区| 亚洲国产尤物| 亚洲男人天堂2023| 高清在线一区| 久久久久久国产精品美女| 99精品国产高清一区二区麻豆| 欧美专区福利在线| 大胆日韩av| 麻豆91av| 91亚洲国产成人精品一区二区三| av免费播放| 日本高清不卡一区| 爱草tv视频在线观看992| 国产精品一区二区av日韩在线| 欧美成人在线免费| 91国产一区| 日本电影亚洲天堂| 在线 亚洲欧美在线综合一区| 午夜影院在线观看国产主播| 伊人久久精品视频| y111111国产精品久久久| 国产精品美女视频网站| 国产欧美日本| 国产日韩欧美精品在线观看| 亚洲国产精品av| 性色视频在线观看| 亚洲精品成人久久| 成人av激情人伦小说| 成人av番号网| 韩国精品一区二区| 99在线免费视频| 7777精品久久久大香线蕉| 樱花草涩涩www在线播放| 国产91精品视频在线观看| 尤物网精品视频| 香港三级日本三级a视频| 亚洲综合一区二区三区| 欧美寡妇性猛交xxx免费| 高清一区二区三区日本久| 亚洲香蕉网站| 午夜免费一区二区| 欧美成人一区二区| 国产欧美日韩精品高清二区综合区| 亚洲春色在线视频| 亚洲高清不卡在线观看| 成人做爰视频www网站小优视频| 国产精品美女www爽爽爽视频| 国产精品亚洲综合一区在线观看| 一不卡在线视频| 久久99国产综合精品女同| 亚洲女优在线| 情趣网站视频在线观看| 影音先锋欧美精品| 久久精品1区| 五十度飞在线播放| 中文字幕在线视频日韩| 在线视频日韩| 亚洲精品一区二区| 俺也去精品视频在线观看| 99综合在线| 一级片在线观看| 992tv成人免费视频| 极品少妇一区二区三区精品视频| 青青草视频在线观看| 久久国产天堂福利天堂| 免费亚洲电影在线| www.成人.com| 国产精品日韩在线| 国产精品天天摸av网| 久久精品女人天堂av免费观看| 国产高清在线一区| 亚洲成人av电影| 欧美日韩大片免费观看| 欧美日韩精品在线一区二区| 亚洲精品99久久久久中文字幕| 国产一区二区中文| 无线免费在线视频| 国产精品草莓在线免费观看| 欧美极品美女视频| 国产精品视频一区二区三区综合| 最新视频 - x88av| 亚洲国产天堂久久国产91 | 久久久7777| 日本高清不卡一区| 伊人久久大香线| 国产在线传媒| 国产精品一区二区三区成人| 亚洲一区二区三区四区中文字幕| 伊人久久大香线蕉综合网站 | 91成人在线播放| 91视频在线观看免费| 日韩一级二级| 真实国产乱子伦对白视频| 亚洲欧美国产制服动漫| 国产美女一区二区| 丝袜诱惑一区二区| 中文字幕制服丝袜在线| 亚洲精选中文字幕| 国产成人av一区二区三区在线| 在线观看v片| 欧美午夜性视频| 久久精品国产成人| 国产日韩精品一区| 久久夜色电影| 免费黄色av电影| 国产精品一香蕉国产线看观看| 污片在线观看一区二区| 午夜久久一区| 丝袜美女在线观看| 久久国产精品网| 久久久久久久久久久国产| 亚洲一区二区中文在线| 亚洲国产中文在线| 视频免费裸体网站| 国产日韩精品一区观看| 亚洲黄页网在线观看| 26uuu久久综合| 日韩电影在线视频| 国产成人高清精品| 在线观看18视频网站| 欧美乱大交xxxxx| 亚洲视频一区二区在线观看| 国产亚洲精品美女久久久久久久久久| 欧美日韩在线精品一区二区三区激情综| 国产一区二区免费在线观看| 日韩精品在线观看一区| 97精品久久久久中文字幕 | 国产一区二区三区在线视频| 久草在线免费福利| 欧美爱爱视频网站| 六十路精品视频| wwwwww欧美| 国产一区二区在线网站| 国产福利视频一区| 久久久日本电影| 91美女片黄在线观| 欧美激情奇米色| 亚洲视频在线播放| 韩国美女主播一区| 国产婷婷一区二区三区| 日韩资源在线观看| 亚洲成a天堂v人片| 日产国产高清一区二区三区| 欧美成人三级| 色播在线视频| 在线观看17c| 成人妇女淫片aaaa视频| 亚洲性日韩精品一区二区| 亚洲五月六月丁香激情| 日本欧美大码aⅴ在线播放| 96sao在线精品免费视频| 精品孕妇一区二区三区| 免费涩涩18网站入口| 国模精品娜娜一二三区| 久久久久国产一区二区三区| 欧美一区二区三区白人| 亚洲欧美影音先锋| 国产一区二区三区在线观看免费 | 国产欧美高清视频在线|