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

java的接口解耦方式

 更新時(shí)間:2021年09月06日 09:00:47   作者:iamkila  
這篇文章主要介紹了java的接口解耦方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java的接口解耦方式

我只想把抽象的東西說(shuō)的具體,或者說(shuō),聽(tīng)起來(lái)簡(jiǎn)單些,明白些。。。

學(xué)過(guò)java的人都知道,java是單繼承的,也就是說(shuō)一個(gè)class只能繼承一個(gè)類。

例如我們想制作一臺(tái)有播放器的手機(jī),那么我們先得制作一個(gè)播放器吧,再把播放器放進(jìn)手機(jī)里。在java會(huì)怎么實(shí)現(xiàn)呢?如果使用繼承,我們會(huì)先創(chuàng)建一個(gè)播放器類,播放器類里面含有播放歌曲功能(方法),創(chuàng)建一個(gè)手機(jī)類繼承播放器類,重寫播放器的播歌功能(不重寫的話,會(huì)直接使用播放器自己定制的播放功能),這樣,我們就可以使用手機(jī)的播歌功能了。

現(xiàn)在,我們想制作一臺(tái)既有播歌功能,又有收音機(jī)功能的手機(jī),那么我們?cè)撛趺崔k?難道我們又要讓繼承了播放器的手機(jī)再繼承收音機(jī)?但是java是單繼承的,行不通,這時(shí),接口應(yīng)運(yùn)而生!

接口,乍一看就是包含幾個(gè)方法的一個(gè)東西,它里面不包含具體實(shí)現(xiàn)的代碼,只包含方法的返回類型,名稱,參數(shù)列表,它代表的是一個(gè)功能的集合,只要實(shí)現(xiàn)了這個(gè)接口的類,他就具有了這些功能。

回到之前說(shuō)的既有播歌又有收音機(jī)功能的手機(jī),現(xiàn)在我們不把播放器和收音機(jī)封裝成類了,我們把它們封裝成接口(接口就是功能的集合),創(chuàng)建手機(jī)類,實(shí)現(xiàn)播放器和收音機(jī)接口,這樣看起來(lái),是不是有點(diǎn)像多繼承?這違背了java的單繼承原則嗎?

其實(shí)沒(méi)有,有些書里面提到的多重繼承指的是多個(gè)實(shí)現(xiàn)接口。繼承(extends),是一種 is-a 關(guān)系的,所謂is-a關(guān)系,就是類似于“手機(jī)是播放器”或者“手機(jī)是收音機(jī)”這樣說(shuō)法,但明顯,我們不能說(shuō)“手機(jī)既是播放器又是收音機(jī)”,那么“他究竟是播放器還是收音機(jī)?”,這時(shí)大家就會(huì)可能這樣發(fā)問(wèn)了,這就是java是單繼承的原因。實(shí)現(xiàn)(implement),是一種hava-a關(guān)系的,所謂have-a就是具有“某一項(xiàng)功能“的意思,我們這時(shí)候會(huì)說(shuō)“手機(jī)既有播放器功能,又有收音機(jī)功能”,這樣的表達(dá)該明白了吧!讓手機(jī)再添加其他功能,只要再讓他實(shí)現(xiàn)那些功能接口就好了。

好像說(shuō)了那么多還沒(méi)說(shuō)到正題~哈哈,其實(shí)舉前面的例子我是想說(shuō)明一個(gè)問(wèn)題:只要一個(gè)方法操作的是類而非接口,那么你只能使用這個(gè)類及其之類。如果你想要將這個(gè)方法應(yīng)用于不在此繼承結(jié)構(gòu)中的某個(gè)類,那么你就觸霉頭了。接口可以在很大程度上放寬這種限制,因此,他使我們可以編寫可復(fù)用性更好的代碼?!谩秚hinking in java》的某一些話。

舉例子

我需要一個(gè)鬧鐘,放在我床邊,每天叫我起床。但是我家里沒(méi)鬧鐘,只有一臺(tái)有鬧鐘功能的手機(jī)和一臺(tái)有鬧鐘功能的洗衣機(jī)。我需要的只是鬧鐘功能,我管他是什么,只要他能讓我起床就好了。如果某一天我連手機(jī)都丟了,我能把洗衣機(jī)放在我床邊叫我起床嗎?當(dāng)然可以,因?yàn)橄匆聶C(jī)實(shí)現(xiàn)了鬧鐘功能。所以,我們經(jīng)常會(huì)這么做:把“鬧鐘”這個(gè)功能(而不是具體的某一項(xiàng)事物,如手機(jī)或者洗衣機(jī))放在床邊,如果我們想聽(tīng)洗衣機(jī)的鬧鐘聲就擺洗衣機(jī),如果想聽(tīng)手機(jī)的鬧鐘聲就擺手機(jī)。

從上面的例子,我們傳遞的不是某個(gè)具體的對(duì)象,而是一個(gè)抽象的“鬧鐘功能”的概念,至于實(shí)際上傳遞的是什么參數(shù),要看具體情況(取決于我想聽(tīng)哪一種鬧鐘聲)。實(shí)際上,我們只關(guān)心“具有鬧鐘功能”這件事,我們不關(guān)心它是由誰(shuí)實(shí)現(xiàn)的和怎樣實(shí)現(xiàn)的,這就做到了“請(qǐng)求”和“實(shí)現(xiàn)”分離開來(lái),這就是接口的解耦!

java接口解耦效果的理解

先看一段代碼

public class A {
    public void say() {
        System.out.println("I am A");
    }
}
public class C {
    public void put(A a) {
        a.say();
    }
}

在C類里面想調(diào)用一個(gè)含有say功能的東西,就把A傳入了,突然有一天,產(chǎn)品經(jīng)理多了個(gè)需求,想讓B這種類型也能在C中作為參數(shù)調(diào)用B的say,也即A,B這兩種類型都能滿足作為輸入,

public class B {
    public void say() {
        System.out.println("I am B");
    }
}

那好煩,不僅要像上面一樣新建B類,還要修改C的代碼適配需求,例如改成下面這個(gè)樣子,搞成重載的樣子,萬(wàn)一產(chǎn)品經(jīng)理又來(lái)要求把D,E,F...這些具有say功能的類可以當(dāng)成參數(shù)輸入,新建D,E,F這些類也就算了,難免嘛,問(wèn)題是還要修改C的類,在里面再添加很多類似的修改,感覺(jué)耦合的很緊,代碼寫的太死板了,變動(dòng)下需求就得改主程序C里面的代碼,

public class C{
    public void put(A a) {
        a.say();
    }
    public void put(B b) {
        b.say();
    }
}

有沒(méi)有其他的好辦法?有,用接口的方法,例如下面

public interface IBase {
    void say();
}
public class A implements IBase {
    @Override
    public void say() {
        System.out.println("I am A");
    }
}
public class B implements IBase {
    @Override
    public void say() {
        System.out.println("I am B");
    }
}
public class C {
    public void put(IBase base) {
        base.say();
    }
}

定義一個(gè)接口,IBase,讓產(chǎn)品經(jīng)理新加的需求B,D,E,F都實(shí)現(xiàn)這個(gè)類,并且把C類里的參數(shù)寫成接口的形式(只要實(shí)現(xiàn)了我這個(gè)接口功能的都能傳入),這樣只要是實(shí)現(xiàn)了IBase接口的類,也即實(shí)現(xiàn)具備了實(shí)現(xiàn)接口say功能的任何類都可以傳進(jìn)來(lái),所以以后只需要新建B,D,E,F時(shí)實(shí)現(xiàn)這個(gè)接口就行了,不需要在C類里面修改源代碼。

這就大大降低了工作量,本質(zhì)上就是降低了耦合度,體現(xiàn)了接口的解耦效果,這是一點(diǎn)關(guān)于對(duì)接口解耦作用的理解

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot使用開發(fā)環(huán)境application.properties問(wèn)題

    SpringBoot使用開發(fā)環(huán)境application.properties問(wèn)題

    這篇文章主要介紹了SpringBoot使用開發(fā)環(huán)境application.properties問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Idea中如何修改項(xiàng)目的SVN地址

    Idea中如何修改項(xiàng)目的SVN地址

    這篇文章主要介紹了Idea中如何修改項(xiàng)目的SVN地址問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java面試題沖刺第十一天--集合框架篇(2)

    Java面試題沖刺第十一天--集合框架篇(2)

    這篇文章主要為大家分享了最有價(jià)值的兩道集合框架的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java?API文檔的使用方法詳解

    Java?API文檔的使用方法詳解

    在開發(fā)過(guò)程中如果遇到疑難問(wèn)題,除了可以在網(wǎng)絡(luò)中尋找答案,也可以在Java API幫助文檔(簡(jiǎn)稱"JDK文檔"”)中查找答案,下面這篇文章主要給大家介紹了關(guān)于Java?API文檔使用的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Java Spring開發(fā)環(huán)境搭建及簡(jiǎn)單入門示例教程

    Java Spring開發(fā)環(huán)境搭建及簡(jiǎn)單入門示例教程

    這篇文章主要介紹了Java Spring開發(fā)環(huán)境搭建及簡(jiǎn)單入門示例,結(jié)合實(shí)例形式分析了spring環(huán)境搭建、配置、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-11-11
  • maven配置阿里云倉(cāng)庫(kù)的實(shí)現(xiàn)方法

    maven配置阿里云倉(cāng)庫(kù)的實(shí)現(xiàn)方法

    本文主要介紹了maven配置阿里云倉(cāng)庫(kù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Spring?boot2.0?日志集成方法分享(1)

    Spring?boot2.0?日志集成方法分享(1)

    這篇文章主要介紹了Spring?boot2.0?日志集成方法分享,Spring?Boot使用Apache的Commons?Logging作為內(nèi)部的日志框架,其僅僅是一個(gè)日志接口,在實(shí)際應(yīng)用中需要為該接口來(lái)指定相應(yīng)的日志實(shí)現(xiàn),下文日志實(shí)現(xiàn)詳情需要的小伙伴可以參考一下
    2022-04-04
  • Java、C++中子類對(duì)父類函數(shù)覆蓋的可訪問(wèn)性縮小的區(qū)別介紹

    Java、C++中子類對(duì)父類函數(shù)覆蓋的可訪問(wèn)性縮小的區(qū)別介紹

    這篇文章主要給大家介紹了關(guān)于Java、C++中子類對(duì)父類函數(shù)覆蓋的可訪問(wèn)性縮小的區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Java concurrency之AtomicLongArray原子類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency之AtomicLongArray原子類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java concurrency之AtomicLongArray原子類的相關(guān)知識(shí),感興趣的朋友參考下吧
    2017-06-06
  • Spring Boot集成Thymeleaf模板引擎的完整步驟

    Spring Boot集成Thymeleaf模板引擎的完整步驟

    這篇文章主要給大家介紹了關(guān)于Spring Boot集成Thymeleaf模板引擎的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02

最新評(píng)論

大冶市| 江门市| 汾西县| 阜阳市| 庆阳市| 溆浦县| 邻水| 志丹县| 宜都市| 肇庆市| 绍兴市| 淳安县| 怀化市| 静宁县| 汉川市| 弥渡县| 天津市| 巫山县| 周至县| 九台市| 阳东县| 青岛市| 密山市| 桃园县| 上栗县| 丰镇市| 峨眉山市| 通州市| 治多县| 阿城市| 西吉县| 封开县| 手游| 唐海县| 武隆县| 永泰县| 休宁县| 武威市| 德惠市| 洛阳市| 邯郸县|