一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java依賴倒轉原則_動力節點Java學院整理

Java依賴倒轉原則_動力節點Java學院整理

2020-12-13 20:16zhengzhb Java教程

這篇文章主要介紹了Java依賴倒轉原則的定義及問題由來解決方案,感興趣的朋友一起看看吧

定義:高層模塊不應該依賴低層模塊,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。

問題由來:類A直接依賴類B,假如要將類A改為依賴類C,則必須通過修改類A的代碼來達成。這種場景下,類A一般是高層模塊,負責復雜的業務邏輯;類B和類C是低層模塊,負責基本的原子操作;假如修改類A,會給程序帶來不必要的風險。

解決方案:將類A修改為依賴接口I,類B和類C各自實現接口I,類A通過接口I間接與類B或者類C發生聯系,則會大大降低修改類A的幾率。

         依賴倒置原則基于這樣一個事實:相對于細節的多變性,抽象的東西要穩定的多。以抽象為基礎搭建起來的架構比以細節為基礎搭建起來的架構要穩定的多。在Java中,抽象指的是接口或者抽象類,細節就是具體的實現類,使用接口或者抽象類的目的是制定好規范和契約,而不去涉及任何具體的操作,把展現細節的任務交給他們的實現類去完成。

         依賴倒置原則的核心思想是面向接口編程,我們依舊用一個例子來說明面向接口編程比相對于面向實現編程好在什么地方。場景是這樣的,母親給孩子講故事,只要給她一本書,她就可以照著書給孩子講故事了。代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Book{
 public String getContent(){
  return "很久很久以前有一個阿拉伯的故事……";
 }
}
class Mother{
 public void narrate(Book book){
  System.out.println("媽媽開始講故事");
  System.out.println(book.getContent());
 }
}
public class Client{
 public static void main(String[] args){
  Mother mother = new Mother();
  mother.narrate(new Book());
 }
}

運行結果:

媽媽開始講故事

很久很久以前有一個阿拉伯的故事……

        運行良好,假如有一天,需求變成這樣:不是給書而是給一份報紙,讓這位母親講一下報紙上的故事,報紙的代碼如下:

?
1
2
3
4
5
class Newspaper{
 public String getContent(){
  return "林書豪38+7領導尼克斯擊敗湖人……";
 }
}

        這位母親卻辦不到,因為她居然不會讀報紙上的故事,這太荒唐了,只是將書換成報紙,居然必須要修改Mother才能讀。假如以后需求換成雜志呢?換成網頁呢?還要不斷地修改Mother,這顯然不是好的設計。原因就是Mother與Book之間的耦合性太高了,必須降低他們之間的耦合度才行。

我們引入一個抽象的接口IReader。讀物,只要是帶字的都屬于讀物:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
interface IReader{
 public String getContent();
}
Mother類與接口IReader發生依賴關系,而Book和Newspaper都屬于讀物的范疇,他們各自都去實現IReader接口,這樣就符合依賴倒置原則了,代碼修改為:
class Newspaper implements IReader {
 public String getContent(){
  return "林書豪17+9助尼克斯擊敗老鷹……";
 }
}
class Book implements IReader{
 public String getContent(){
  return "很久很久以前有一個阿拉伯的故事……";
 }
}
class Mother{
 public void narrate(IReader reader){
  System.out.println("媽媽開始講故事");
  System.out.println(reader.getContent());
 }
}
public class Client{
 public static void main(String[] args){
  Mother mother = new Mother();
  mother.narrate(new Book());
  mother.narrate(new Newspaper());
 }
}

運行結果:

媽媽開始講故事
很久很久以前有一個阿拉伯的故事……
媽媽開始講故事

林書豪17+9助尼克斯擊敗老鷹……   

這樣修改后,無論以后怎樣擴展Client類,都不需要再修改Mother類了。這只是一個簡單的例子,實際情況中,代表高層模塊的Mother類將負責完成主要的業務邏輯,一旦需要對它進行修改,引入錯誤的風險極大。所以遵循依賴倒置原則可以降低類之間的耦合性,提高系統的穩定性,降低修改程序造成的風險。   

采用依賴倒置原則給多人并行開發帶來了極大的便利,比如上例中,原本Mother類與Book類直接耦合時,Mother類必須等Book類編碼完成后才可以進行編碼,因為Mother類依賴于Book類。修改后的程序則可以同時開工,互不影響,因為Mother與Book類一點關系也沒有。參與協作開發的人越多、項目越龐大,采用依賴導致原則的意義就越重大。現在很流行的TDD開發模式就是依賴倒置原則最成功的應用。        

傳遞依賴關系有三種方式,以上的例子中使用的方法是接口傳遞,另外還有兩種傳遞方式:構造方法傳遞和setter方法傳遞,相信用過Spring框架的,對依賴的傳遞方式一定不會陌生。
在實際編程中,我們一般需要做到如下3點:

  • ?低層模塊盡量都要有抽象類或接口,或者兩者都有。
  • ?變量的聲明類型盡量是抽象類或接口。
  • ?使用繼承時遵循里氏替換原則。

        依賴倒置原則的核心就是要我們面向接口編程,理解了面向接口編程,也就理解了依賴倒置。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黄动漫车车好快的车车双女主 | 日本人成年视频在线观看 | 精品亚洲国产一区二区 | 精品免费久久久久久成人影院 | 免费一级特黄特色大片∵黄 | 亚洲高清中文字幕 | 青苹果乐园影院免费观看完整版 | 日韩欧美推理片免费看完整版 | 男同gay作爰视频网站 | 香蕉久久高清国产精品免费 | 日本妇人成熟免费不卡片 | 国产成人久久久精品一区二区三区 | 午夜影院网页 | 妹妹骑上来蹭着蹭着就射了 | 国产欧美日韩精品一区二 | japan孕妇孕交freehd | 欧美a一片xxxx片与善交 | 欧美精品三区 | 久久er99热精品一区二区 | 天堂伊人网 | 久久精品中文字幕 | 国产一区二区三区福利 | 国产激情一区二区三区四区 | 十八女下面流水不遮免费 | 99在线观看国产 | 精品国产精品人妻久久无码五月天 | 国产一级免费片 | aⅴ导航站 | 亚洲日韩欧美一区二区在线 | porono日本人xxx | 特黄视频 | 国产99精品免费视频看6 | 搡60一70岁的老女人小说 | 大伊香蕉在线精品不卡视频 | 喷出奶汁了h | 色婷婷久久综合中文久久一本` | 国产麻豆网| 亚洲黄网站wwwwww | 亚洲国产精品久久久久久 | 妹妹你插的我好爽 | 久久亚洲精品AV成人无码 |