理解java解耦


學過java的人都知道,java是單繼承的,也就是說一個class只能繼承一個類。
       例如我們想制作一台有播放器的手機,那么我們先得制作一個播放器吧,再把播放器放進手機里。在java會怎么實現呢?如果使用繼承,我們會先創建一個播放器類,播放器類里面含有播放歌曲功能(方法),創建一個手機類繼承播放器類,重寫播放器的播歌功能(不重寫的話,會直接使用播放器自己定制的播放功能),這樣,我們就可以使用手機的播歌功能了。
       現在,我們想制作一台既有播歌功能,又有收音機功能的手機,那么我們該怎么辦?難道我們又要讓繼承了播放器的手機再繼承收音機?但是java是單繼承的,行不通,這時,接口應運而生!

      接口,乍一看就是包含幾個方法的一個東西,它里面不包含具體實現的代碼,只包含方法的返回類型,名稱,參數列表,它代表的是一個功能的集合,只要實現了這個接口的類,他就具有了這些功能。
       回到之前說的既有播歌又有收音機功能的手機,現在我們不把播放器和收音機封裝成類了,我們把它們封裝成接口(接口就是功能的集合),創建手機類,實現播放器和收音機接口,這樣看起來,是不是有點像多繼承?這違背了java的單繼承原則嗎?

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

        好像說了那么多還沒說到正題~哈哈,其實舉前面的例子我是想說明一個問題:只要一個方法操作的是類而非接口,那么你只能使用這個類及其之類。如果你想要將這個方法應用於不在此繼承結構中的某個類,那么你就觸霉頭了。接口可以在很大程度上放寬這種限制,因此,他使我們可以編寫可復用性更好的代碼。——引用《thinking in java》的某一些話。
         
        舉例子:我需要一個鬧鍾,放在我床邊,每天叫我起床。但是我家里沒鬧鍾,只有一台有鬧鍾功能的手機和一台有鬧鍾功能的洗衣機。我需要的只是鬧鍾功能,我管他是什么,只要他能讓我起床就好了。如果某一天我連手機都丟了,我能把洗衣機放在我床邊叫我起床嗎?當然可以,因為洗衣機實現了鬧鍾功能。所以,我們經常會這么做:把“鬧鍾”這個功能(而不是具體的某一項事物,如手機或者洗衣機)放在床邊,如果我們想聽洗衣機的鬧鍾聲就擺洗衣機,如果想聽手機的鬧鍾聲就擺手機。
         從上面的例子,我們傳遞的不是某個具體的對象,而是一個抽象的“鬧鍾功能”的概念,至於實際上傳遞的是什么參數,要看具體情況(取決於我想聽哪一種鬧鍾聲)。實際上,我們只關心“具有鬧鍾功能”這件事,我們不關心它是由誰實現的和怎樣實現的,這就做到了“請求”和“實現”分離開來,這就是接口的解耦!

       
轉自https://blog.csdn.net/iamkila/article/details/7257303?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM