接口優(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類庫(kù)中的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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容