java的接口解耦方式_第1頁
java的接口解耦方式_第2頁
java的接口解耦方式_第3頁
java的接口解耦方式_第4頁
java的接口解耦方式_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第java的接口解耦方式目錄java的接口解耦方式舉例子java接口解耦效果的理解先看一段代碼

java的接口解耦方式

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

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

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

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

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

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

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

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

舉例子

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

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

java接口解耦效果的理解

先看一段代碼

publicclassA{

publicvoidsay(){

System.out.println("IamA");

publicclassC{

publicvoidput(Aa){

a.say();

}

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

publicclassB{

publicvoidsay(){

System.out.println("IamB");

}

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

publicclassC{

publicvoidput(Aa){

a.say();

publicvoidput(Bb){

b.say();

}

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

publicinterfaceIBase{

voidsay();

publicclassAimplementsIBase{

@Override

publicvoidsay(){

System.out.println("IamA");

publicclassBimplementsIBase{

@Override

publicvoidsay(){

System.out.println("IamB");

publicclassC{

publicvoidput(IBasebase){

base.say();

}

定義一個接口,IBase,讓產品經理新加的需求B,D,E,F都實現(xiàn)這個類,并且把C類里的參數(shù)寫成接口的形式(只要實現(xiàn)了我這個接口功能的都能傳入),這樣只要是實現(xiàn)了IBase接口的類,也即實現(xiàn)具備了實現(xiàn)接口say功能的任何類都可以傳進來

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論