接口優(yōu)于抽象類

第18條:接口優(yōu)于抽象類


1.內(nèi)容向?qū)?/h4>

內(nèi)容向?qū)?/div>

本條內(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)的類型:

    遵守層次結(jié)構(gòu)的類型關(guān)系.png

    如上圖温赔,對(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ì)象的求和工作了豫尽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末篙梢,一起剝皮案震驚了整個(gè)濱河市柔袁,隨后出現(xiàn)的幾起案子臀脏,更是在濱河造成了極大的恐慌凡简,老刑警劉巖因俐,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異妄呕,居然都是意外死亡陶舞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門绪励,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肿孵,“玉大人,你說我怎么就攤上這事优炬“渚” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蠢护,是天一觀的道長(zhǎng)雅宾。 經(jīng)常有香客問我,道長(zhǎng)葵硕,這世上最難降的妖魔是什么眉抬? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮懈凹,結(jié)果婚禮上蜀变,老公的妹妹穿的比我還像新娘。我一直安慰自己介评,他們只是感情好库北,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著们陆,像睡著了一般寒瓦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坪仇,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天杂腰,我揣著相機(jī)與錄音,去河邊找鬼椅文。 笑死喂很,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的皆刺。 我是一名探鬼主播少辣,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼芹橡!你這毒婦竟也來了毒坛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎煎殷,沒想到半個(gè)月后屯伞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豪直,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年劣摇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弓乙。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡末融,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出暇韧,到底是詐尸還是另有隱情勾习,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布懈玻,位于F島的核電站巧婶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涂乌。R本人自食惡果不足惜艺栈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望湾盒。 院中可真熱鬧湿右,春花似錦、人聲如沸罚勾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尖殃。三九已至堰塌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間分衫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工般此, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚪战,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓铐懊,卻偏偏與公主長(zhǎng)得像邀桑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子科乎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • java中可以用來定義允許多個(gè)實(shí)現(xiàn)的類型有兩種:接口和抽象類壁畸。 接口和抽象類的區(qū)別: 1,抽象類中可以存在某些方法...
    郭_4d5f閱讀 605評(píng)論 0 0
  • 一太抓、抽象類 1、抽象類含義的概括: 當(dāng)多個(gè)類出現(xiàn)相同功能時(shí)令杈,但功能主體不同走敌,這樣可以向上抽取,抽取時(shí)只抽取功能定義...
    玉圣閱讀 828評(píng)論 0 6
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,770評(píng)論 25 707
  • 簡(jiǎn)化的時(shí)間管理流程包括主要三個(gè)步驟:收集,整理异雁,回顧捶障。 仔細(xì)想想,這中間流動(dòng)的都是什么纲刀?更多的是文字项炼。可是柑蛇,我們的...
    時(shí)間管理講師澤陽閱讀 395評(píng)論 0 4
  • 早上起來就看到Moses6:00多就在群里說已經(jīng)到深圳老家了芥挣,估計(jì)他昨晚通宵在整理行李。 和Lemo一起去酒店的餐...
    Mi絲喵閱讀 139評(píng)論 0 0