最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java的依賴倒置原則你了解多少

 更新時(shí)間:2022年02月09日 15:40:48   作者:寫B(tài)ug的渣渣高  
這篇文章主要為大家詳細(xì)介紹了java的依賴倒置原則,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

依賴倒置原則

什么是依賴倒置原則:

高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象

抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象

針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程

即:

每個(gè)類盡量繼承自接口或者抽象類

優(yōu)點(diǎn):減少類之間的耦合,提高代碼的穩(wěn)定性,代碼的可讀性維護(hù)性。

案例:

背景:

現(xiàn)在有一個(gè)用戶類叫Ggzx(也就是我),想要學(xué)習(xí)一些課程,簡(jiǎn)單的來(lái)實(shí)現(xiàn)調(diào)用學(xué)習(xí)的方法,然后在一個(gè)Test類之中輸入學(xué)習(xí)的內(nèi)容。但是我暫時(shí)只學(xué)java和web,但是可能我后面還要學(xué)習(xí)Spring,SpringMVC…

1.面向?qū)崿F(xiàn)編程

public class Ggzx {
    public void stduyJava(){
        System.out.println("學(xué)習(xí)了java課程");
    }
    public void studyWeb(){
        System.out.println("學(xué)習(xí)了Web課程");
    }
}
public class Test {
    public static void main(String[] args) {
        Ggzx ggzx=new Ggzx();
        ggzx.studyJava();
        ggzx.studyPython();
        ggzx.studyGo();
    }
}

分析:

上面使用的面向?qū)崿F(xiàn)編程,但是Test作為我們控制的"應(yīng)用層",也就是高層,而Ggzx作為低層,其實(shí)這樣在比較簡(jiǎn)單的例子中,其實(shí)是沒(méi)問(wèn)題的,因?yàn)榧偃绮恍枰獢U(kuò)展,僅僅是實(shí)現(xiàn)兩個(gè)很簡(jiǎn)單的功能,并沒(méi)有必要去面向接口開發(fā),但是一般在開發(fā)中通常有很復(fù)雜的開發(fā)環(huán)境和開發(fā)需求。

現(xiàn)在如果想添加新的功能,學(xué)習(xí)其他的課程,怎么辦???

繼續(xù)使用面向?qū)崿F(xiàn)編程,直接在 Ggzx 類中直接添加新的方法,可以完成這個(gè)功能需求。

用上面的方法實(shí)現(xiàn)有沒(méi)有缺點(diǎn)???

1.學(xué)習(xí)的課程和 Ggzx 類耦合比較嚴(yán)重。是學(xué)習(xí)的課程只能通過(guò)Ggzx 才能得到 。并且是想要學(xué)習(xí)新的課程也要在 Ggzx 類中不斷添加和修改 —>高耦合

2.Ggzx 作為當(dāng)前 demo 的底層,經(jīng)常的被改動(dòng),高層Test依賴于低層 Ggzx 的實(shí)現(xiàn) ---->對(duì)應(yīng)依賴倒置原則中的:高層過(guò)度依賴低層了

2.面向接口編程(簡(jiǎn)單版)

為了解決上面出現(xiàn)的問(wèn)題,我們可以考慮把學(xué)習(xí)的課程抽出來(lái)成為一個(gè)類。到現(xiàn)在,類和類之間的耦合其實(shí)就已經(jīng)降低很多了。然后將其當(dāng)做參數(shù)傳入Ggzx里面,然后調(diào)用課程里面的學(xué)習(xí)方法

//web課程類
public class WebCourse  {
    public void studyCourse() {
        System.out.println("學(xué)習(xí)了Web課程");
    }
}
//這里是Java課程類
public class JavaCourse {
    public void studyCourse() {
        System.out.println("學(xué)習(xí)Java課程");
    }
}

當(dāng)我們寫出來(lái)這兩個(gè)類,想要對(duì)Ggzx里面的學(xué)習(xí)方法進(jìn)行編寫的時(shí)候,有沒(méi)有發(fā)現(xiàn)其實(shí)有一些小問(wèn)題呢????

Ggzx里面接收這些類的參數(shù)是什么??

難道要這樣?

//以下是Ggzx類中的內(nèi)容
    public void studyJava(JavaCourse javaCourse){
    }
    public void studyWeb(WebCourse webCourse){
    }

nonono,如果這樣做,雖然當(dāng)前已經(jīng)把課程類和 Ggzx 用戶剝離一點(diǎn)點(diǎn)了,但是是還是形同虛設(shè),課程類雖然分離開了,但是還是像狗皮膏藥一樣貼在 Ggzx 類中,但是看著還是很難受,高層 Test 調(diào)用方法還是得依賴 Ggzx 里面有什么方法

  • 每次加入新課程,都需要修改底層功能

如何修改???

接口是個(gè)好東西,課程類之間是不是都包含同樣一個(gè)方法,被學(xué)習(xí)的方法( studyCourse ),那么我們可以將所有課程類都實(shí)現(xiàn)一個(gè)ICourse課程!

對(duì)應(yīng)上面的問(wèn)題,我們?cè)搨魅胧裁磪?shù)能解決問(wèn)題??可以傳入一個(gè)接口

改編后的 UML 圖解展示(Ggzx 被廢棄,用新的 NewGgzx 代替):

在這里插入圖片描述

(如果沒(méi)了解過(guò)UML類圖,或者是純小白,只需要知道一個(gè)大框是一個(gè)類,虛線表示實(shí)現(xiàn)了箭頭方向的接口,小m是方法 即可)

觀察上面的UML圖

WebCourse 和 JavaCourse 實(shí)現(xiàn)自同一個(gè)接口 ICourse,每個(gè)課程都有自己的 studyXxx 方法。

這樣好在什么地方?

課程類和Ggzx類是解耦的,無(wú)論你增加多少個(gè)課程類,只要實(shí)現(xiàn)了ICourse接口,都能直接傳入Ggzx的studyMyCourse()方法中

public interface ICourse {
    void studyCourse();
}
public interface ICourse {
    void studyCourse();
}
public class NewGgzx {
	public void studyMyCourse(ICourse iCourse){
		iCourse.studyCourse();
	}
	}

上面就是案例的面向接口編程,我們可以看到,在 NewGgzx 類中,我們可以傳入一個(gè)實(shí)現(xiàn) ICourse 接口的課程類,我們?cè)赥est類中調(diào)用的時(shí)候,只需要傳入一個(gè)課程類即可調(diào)用學(xué)習(xí)方法,這樣當(dāng)想擴(kuò)展新的內(nèi)容,只需要?jiǎng)?chuàng)建一個(gè)新的課程類實(shí)現(xiàn) ICourse 即可

Test使用

NewGgzx newGgzx =new NewGgzx();
newGgzx.studyMoocCourse(new WebCourse());
newGgzx.studyMoocCourse(new com.ggzx.design.priciple.dependenceiversion.JavaCourse());

從面向?qū)崿F(xiàn)到面向接口,我們處理問(wèn)題的方法改變了:

  • 開始時(shí),我們需要考慮在Test類中調(diào)用Ggzx里面的哪一種學(xué)習(xí)方法,即注重調(diào)用什么方法能夠?qū)崿F(xiàn)特定的課程
  • 到面向接口編程,我們考慮傳入什么課程即可實(shí)現(xiàn)學(xué)習(xí)

當(dāng)業(yè)務(wù)需求拓展時(shí),拓展方法也改變了:

  • 面向?qū)崿F(xiàn):需要改變底層的代碼來(lái)協(xié)調(diào)我們需要使用的功能,用上面的例子來(lái)解釋就是:當(dāng)你想要學(xué)習(xí)一個(gè)課程,你就需要改變你底層的實(shí)現(xiàn),增加新的代碼
  • 面向接口:想學(xué)習(xí)什么課程,不會(huì)對(duì)其他課程造成影響,也不會(huì)影響到低層的Ggzx 。實(shí)際操作就是增加一門新的課程即可,實(shí)現(xiàn)接口之后,傳入這個(gè)類到Ggzx的方法中就可以學(xué)習(xí)這一門課了

相對(duì)于細(xì)節(jié)的多變性,抽象的東西更穩(wěn)定,以抽象為基礎(chǔ)搭建的架構(gòu)比以細(xì)節(jié)搭建的架構(gòu)更加穩(wěn)定

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!     

相關(guān)文章

  • Springboot整合mybatisplus的項(xiàng)目實(shí)戰(zhàn)

    Springboot整合mybatisplus的項(xiàng)目實(shí)戰(zhàn)

    本文主要介紹了Springboot整合mybatisplus的項(xiàng)目實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • MyBatis-Plus條件構(gòu)造器Wrapper應(yīng)用實(shí)例

    MyBatis-Plus條件構(gòu)造器Wrapper應(yīng)用實(shí)例

    QueryWrapper是用于查詢的Wrapper條件構(gòu)造器,可以通過(guò)它來(lái)構(gòu)建SELECT語(yǔ)句中的WHERE條件,這篇文章主要介紹了MyBatis-Plus數(shù)據(jù)表操作條件構(gòu)造器Wrapper,需要的朋友可以參考下
    2023-09-09
  • GC算法實(shí)現(xiàn)垃圾優(yōu)先算法

    GC算法實(shí)現(xiàn)垃圾優(yōu)先算法

    為什么會(huì)存在那么多的垃圾回收算法呢?我想這個(gè)問(wèn)題的答案可能是沒(méi)有任何一種內(nèi)存回收算法是完美的,所以在針對(duì)不同的情景需求下,不同的內(nèi)存回收算法有其獨(dú)特的優(yōu)勢(shì),所以最后就延續(xù)了多種回收算法
    2022-01-01
  • java實(shí)現(xiàn)畫圖板功能

    java實(shí)現(xiàn)畫圖板功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)畫圖板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Mybatis-Plus select不列出全部字段的方法

    Mybatis-Plus select不列出全部字段的方法

    這篇文章主要介紹了Mybatis-Plus select不列出全部字段的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringCloud超詳細(xì)講解Feign聲明式服務(wù)調(diào)用

    SpringCloud超詳細(xì)講解Feign聲明式服務(wù)調(diào)用

    Feign可以把Rest的請(qǐng)求進(jìn)行隱藏,偽裝成類似Spring?MVC的Controller一樣。不用再自己拼接url,拼接參數(shù)等等操作,一切都交給Feign去做
    2022-06-06
  • Runtime.getRuntime().exec 路徑包含空格的解決

    Runtime.getRuntime().exec 路徑包含空格的解決

    這篇文章主要介紹了Runtime.getRuntime().exec 路徑包含空格的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中wait與sleep的區(qū)別講解(wait有參及無(wú)參區(qū)別)

    Java中wait與sleep的區(qū)別講解(wait有參及無(wú)參區(qū)別)

    這篇文章主要介紹了Java中wait與sleep的講解(wait有參及無(wú)參區(qū)別),通過(guò)代碼介紹了wait()?與wait(?long?timeout?)?區(qū)別,wait(0)?與?sleep(0)區(qū)別,需要的朋友可以參考下
    2022-04-04
  • Mybatis圖文并茂講解分頁(yè)插件

    Mybatis圖文并茂講解分頁(yè)插件

    使用過(guò)mybatis的人都知道,mybatis本身就很小且簡(jiǎn)單,sql寫在xml里,統(tǒng)一管理和優(yōu)化。缺點(diǎn)當(dāng)然也有,比如我們使用過(guò)程中,要使用到分頁(yè),如果用最原始的方式的話,1.查詢分頁(yè)數(shù)據(jù),2.獲取分頁(yè)長(zhǎng)度,也就是說(shuō)要使用到兩個(gè)方法才能完成分頁(yè)
    2022-07-07
  • 使用Springboot處理跨域的方式

    使用Springboot處理跨域的方式

    這篇文章主要介紹了使用Springboot處理跨域的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09

最新評(píng)論

昌平区| 丹江口市| 萍乡市| 牟定县| 田东县| 中西区| 都江堰市| 公主岭市| 惠来县| 大田县| 南京市| 大田县| 定州市| 旬邑县| 林州市| 上饶县| 赣榆县| 梨树县| 樟树市| 河北区| 东台市| 江都市| 寿光市| 平安县| 穆棱市| 仁化县| 衡水市| 罗田县| 广南县| 霍城县| 涿州市| 蓬莱市| 定襄县| 仁寿县| 绥滨县| 东至县| 包头市| 铜梁县| 上犹县| 常熟市| 永顺县|