第18條:接口優(yōu)于抽象類
1.內(nèi)容向?qū)?/h4>
本條內(nèi)容的主要重點(diǎn)——骨架類均芽,集成接口和抽象類的優(yōu)點(diǎn)于一身。
2.接口的優(yōu)點(diǎn)
現(xiàn)有的類可以很容易的被更新单鹿,以實(shí)現(xiàn)新的接口掀宋。
如果你前期編寫了一個(gè)類A,后期有在系統(tǒng)中加入了一個(gè)新的接口B仲锄,當(dāng)你想讓前期編寫的類來實(shí)現(xiàn)這個(gè)接口劲妙,你只用加上一句implement B,然后在類A中實(shí)現(xiàn)里面的方法即可儒喊,不會(huì)影響到以前的類對(duì)類A的使用镣奋。接口是定義mixin(混合類型)的理想選擇。
這一條主要說的是澄惊,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口唆途。一個(gè)類除了可以實(shí)現(xiàn)一個(gè)它的主要類型接口之外,還可以加入一些輔助接口來實(shí)現(xiàn)一些新的功能掸驱。-
接口允許我們構(gòu)造非層次結(jié)構(gòu)的類型框架肛搬。
之一條主要說的是,接口可以多繼承毕贼。
層次結(jié)構(gòu)的類型:
如上圖温赔,對(duì)于這種遵守參差結(jié)構(gòu)的類型來說,我們要用類的繼承來實(shí)現(xiàn)是容易的鬼癣。但是我們遇到的類型關(guān)系并不總是遵循這種層次類型陶贼。
比如:web開發(fā)啤贩,我們有一種程序猿類型為“前端攻城獅”,一種類型為“后端攻城獅”還有一種是“web全棧攻城獅”拜秧,我們要用類來表示他們?nèi)咧g的三角關(guān)系痹屹,啊不對(duì),是類型關(guān)系的話將會(huì)是一件十分困難的事情枉氮。但是如果用接口志衍,將會(huì)十分輕松。直接定義三個(gè)類型的接口聊替,讓“web全棧攻城獅”同時(shí)繼承前端和后端工程師即可楼肪。 接口可以使得類的增強(qiáng)變得安全。
這一點(diǎn)主要說的是第16條(復(fù)合優(yōu)于繼承)中的“包裝類”惹悄。
3. 骨架類
眾所周知春叫,java 8之前接口是不可以有方法體的,這就是抽象類相對(duì)于接口的優(yōu)勢(shì)泣港,為了將抽象類和接口的優(yōu)勢(shì)整合起來暂殖,“骨架類”就誕生了,骨架類的做法是用一個(gè)抽象類來實(shí)現(xiàn)一個(gè)接口当纱,在抽象類中為接口的某些方法提供實(shí)現(xiàn)央星。
骨架類的實(shí)現(xiàn)的一般步驟是,找出接口中的基本方法惫东,在抽象類中聲明為抽象方法,然后用這些基本方法來實(shí)現(xiàn)其他方法毙石,所謂基本方法廉沮,就是通過將這些方法組合或是變換,可以實(shí)現(xiàn)其他的方法徐矩。
4.有關(guān)骨架類的例子
為了便于理解滞时,這里舉一個(gè)炒雞簡(jiǎn)單的例子,想看更深層次的例子滤灯,可以去看java類庫中的AbstractCollection<E>這個(gè)類坪稽。
例子:
假設(shè)有一個(gè)接口,它可以實(shí)現(xiàn)一組對(duì)象的求和鳞骤,代碼如下:
public interface Summation<T> {
//實(shí)現(xiàn)兩個(gè)對(duì)象的相加
T towEleAdd(T obj01, T obj02);
//實(shí)現(xiàn)List求和
T listEleSum(List<T> list);
//實(shí)現(xiàn)數(shù)組求和
T arrayEleSum(T[] array);
}
根據(jù)觀察窒百,它的基本方法只有一個(gè)T towEleAdd(T obj01, T obj02);
,現(xiàn)在我們可以來實(shí)現(xiàn)他的“骨架”了:
public abstract class AbstractSummation<T> implements Summation<T> {
@Override
public abstract T towEleAdd(T obj01, T obj02);
@Override
public T listEleSum(List<T> list) {
T firstEle = null;
for (T t : list) {
if (firstEle == null) {
firstEle = t;
continue;
}
firstEle = towEleAdd(firstEle, t);
}
return firstEle;
}
@Override
public T arrayEleSum(T[] array) {
T firstEle = null;
for (T t : array) {
if (firstEle == null) {
firstEle = t;
continue;
}
firstEle = towEleAdd(firstEle, t);
}
return firstEle;
}
}
繼承這個(gè)骨架類就只用實(shí)現(xiàn)towEleAdd方法,就可以完成一組對(duì)象的求和工作了豫尽。
- 文/潘曉璐 我一進(jìn)店門绪励,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肿孵,“玉大人,你說我怎么就攤上這事优炬“渚” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵蠢护,是天一觀的道長(zhǎng)雅宾。 經(jīng)常有香客問我,道長(zhǎng)葵硕,這世上最難降的妖魔是什么眉抬? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮懈凹,結(jié)果婚禮上蜀变,老公的妹妹穿的比我還像新娘。我一直安慰自己介评,他們只是感情好库北,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著们陆,像睡著了一般寒瓦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坪仇,一...
- 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼芹橡!你這毒婦竟也來了毒坛?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎煎殷,沒想到半個(gè)月后屯伞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡豪直,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年劣摇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弓乙。...
- 正文 年R本政府宣布懈玻,位于F島的核電站巧婶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涂乌。R本人自食惡果不足惜艺栈,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望湾盒。 院中可真熱鬧湿右,春花似錦、人聲如沸罚勾。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽尖殃。三九已至堰塌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間分衫,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓铐懊,卻偏偏與公主長(zhǎng)得像邀桑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子科乎,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- java中可以用來定義允許多個(gè)實(shí)現(xiàn)的類型有兩種:接口和抽象類壁畸。 接口和抽象類的區(qū)別: 1,抽象類中可以存在某些方法...
- 一太抓、抽象類 1、抽象類含義的概括: 當(dāng)多個(gè)類出現(xiàn)相同功能時(shí)令杈,但功能主體不同走敌,這樣可以向上抽取,抽取時(shí)只抽取功能定義...
- Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
- 簡(jiǎn)化的時(shí)間管理流程包括主要三個(gè)步驟:收集,整理异雁,回顧捶障。 仔細(xì)想想,這中間流動(dòng)的都是什么纲刀?更多的是文字项炼。可是柑蛇,我們的...