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

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

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

服務器之家 - 編程語言 - Java教程 - java的接口解耦方式

java的接口解耦方式

2021-12-20 13:52iamkila Java教程

這篇文章主要介紹了java的接口解耦方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

java的接口解耦方式

我只想把抽象的東西說的具體,或者說,聽起來簡單些,明白些。。。

學過java的人都知道,java是單繼承的,也就是說一個class只能繼承一個類。

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

現在,我們想制作一臺既有播歌功能,又有收音機功能的手機,那么我們該怎么辦?難道我們又要讓繼承了播放器的手機再繼承收音機?但是java是單繼承的,行不通,這時,接口應運而生!

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

回到之前說的既有播歌又有收音機功能的手機,現在我們不把播放器和收音機封裝成類了,我們把它們封裝成接口(接口就是功能的集合),創建手機類,實現播放器和收音機接口,這樣看起來,是不是有點像多繼承?這違背了java的單繼承原則嗎?

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

好像說了那么多還沒說到正題~哈哈,其實舉前面的例子我是想說明一個問題:只要一個方法操作的是類而非接口,那么你只能使用這個類及其之類。如果你想要將這個方法應用于不在此繼承結構中的某個類,那么你就觸霉頭了。接口可以在很大程度上放寬這種限制,因此,他使我們可以編寫可復用性更好的代碼。——引用《thinking in java》的某一些話。

舉例子

我需要一個鬧鐘,放在我床邊,每天叫我起床。但是我家里沒鬧鐘,只有一臺有鬧鐘功能的手機和一臺有鬧鐘功能的洗衣機。我需要的只是鬧鐘功能,我管他是什么,只要他能讓我起床就好了。如果某一天我連手機都丟了,我能把洗衣機放在我床邊叫我起床嗎?當然可以,因為洗衣機實現了鬧鐘功能。所以,我們經常會這么做:把“鬧鐘”這個功能(而不是具體的某一項事物,如手機或者洗衣機)放在床邊,如果我們想聽洗衣機的鬧鐘聲就擺洗衣機,如果想聽手機的鬧鐘聲就擺手機。

從上面的例子,我們傳遞的不是某個具體的對象,而是一個抽象的“鬧鐘功能”的概念,至于實際上傳遞的是什么參數,要看具體情況(取決于我想聽哪一種鬧鐘聲)。實際上,我們只關心“具有鬧鐘功能”這件事,我們不關心它是由誰實現的和怎樣實現的,這就做到了“請求”和“實現”分離開來,這就是接口的解耦!

java接口解耦效果的理解

先看一段代碼

?
1
2
3
4
5
6
7
8
9
10
public class A {
    public void say() {
        System.out.println("I am A");
    }
}
public class C {
    public void put(A a) {
        a.say();
    }
}

在C類里面想調用一個含有say功能的東西,就把A傳入了,突然有一天,產品經理多了個需求,想讓B這種類型也能在C中作為參數調用B的say,也即A,B這兩種類型都能滿足作為輸入,

?
1
2
3
4
5
public class B {
    public void say() {
        System.out.println("I am B");
    }
}

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

?
1
2
3
4
5
6
7
8
public class C{
    public void put(A a) {
        a.say();
    }
    public void put(B b) {
        b.say();
    }
}

有沒有其他的好辦法?有,用接口的方法,例如下面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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();
    }
}

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

這就大大降低了工作量,本質上就是降低了耦合度,體現了接口的解耦效果,這是一點關于對接口解耦作用的理解

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/iamkila/article/details/7257303

延伸 · 閱讀

精彩推薦
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
主站蜘蛛池模板: 俄罗斯13一14处出血视频在线 | 五月天91 | h版欧美大片免费观看 | 色播影院性播影院私人影院 | 色先锋av资源中文字幕 | 麻豆网 | 91九色porn偷拍在线 | 99精品网站 | 大ji吧快给我别停受不了视频 | 亚洲午夜大片 | 日韩精品在线视频观看 | 清纯漂亮女友初尝性过程 | 免费理伦片手机在线播放 | 99热这里只有精品在线观看 | 调教催眠 | 国产精品露脸国语对白99 | 精品国偷自产在线 | 亚洲阿v天堂在线2017 | 久久天天综合 | 成人午夜剧场 | 久久久久久久国产精品视频 | 70岁多老妇人特黄a级毛片 | 我与肥熟老妇的性事 | 嫩草影院精品视频在线观看 | 动漫jk美女被爆羞羞漫画 | 国产香蕉97碰碰久久人人 | 免费高清在线视频色yeye | 丝瓜茄子绿巨人秋葵榴莲污 | 999导航| 精品无码人妻一区二区免费AV | 亚洲AV永久无码精品老司机蜜桃 | 99久久精品免费精品国产 | 午夜国产精品 | 青草久久精品亚洲综合专区 | tube69xxxxhd日本| 我们中文在线观看免费完整版 | 99国产精品久久久久久久... | 男女激情视频1000辣妞范 | 公交车强校花系列小说 | 向日葵视频app下载18岁以下勿看 | 免费观看美女被cao视频 |