.
.
作者 :萬境絕塵
轉載請註明出處 : http://blog.csdn.net/shulianghan/article/details/19028507
.
介面型模式組成 : 該模式包括適配器(Adapter)模式,外觀(Facade)模式,合成(Composite)模式,橋接(Bridge)模式 四種模式;
類的介面 :
-- 前置條件 : 介面A, 類B, 類B實現介面A;
-- 允許訪問 : 類A允許其它類的對象可以訪問類B的 方法 與 欄位, 類A 是類B的介面;
-- 實現關係 : 類B 方法需要實現 類A介面的方法名表示的操作, 類A 的實現就是 類B 中方法體的代碼;
介面與實現的概念 : 介面 與 實現 二者是分離的, Java允許多個類實現同一個介面, 提供相同的功能; 也允許一個類實現多個介面;
-- 介面: 對象必須遵循的承諾;
-- 實現 : 對象如果履行承諾;
1. 介面與抽象類別
介面與抽象類別的區別 : 即使抽象類別中全是抽象方法, 看起來與介面類似, 但是還是與介面有很大的不同;
-- 實現繼承個數 : 類A 可以實現多個介面, 但是只能繼承一個抽象類別;
-- 抽象方法個數 : 介面中必須都是抽象方法, 抽象類別中可以包含具體方法;
-- 是否使用欄位 : 介面中只能建立 static final 常量欄位, 抽象類別中可以聲明和使用任何類型欄位;
-- 方法的描述符 : 介面中方法必須是public修飾, 抽象類別中可以是任何限定;
-- 是否建構函式 : 介面沒有建構函式, 抽象類別可以有建構函式;
C語言與Java在介面方面的區別 : C語言中只有抽象類別, 沒有介面, Java語言中二者皆有;
介面作用 : 如果不能使用介面, 完全可以使用抽象類別來代替, 介面在多層開發中發揮很大作用, 例如在J2EE中的MVC架構;
實際例子 : 火炮 和 坦克 都屬於裝甲車, 二者的應用場合各有不同, 但是它們有相同之處, 可以定義成介面 :
public interface Panzer {abstract int getSpeed();//擷取速度public double getCaliber();//擷取口徑void fire();//開火}
從上面的例子列舉介面的一些特性 :
-- 抽象方法 : 介面中的方法都是抽象方法, 不管有沒有abstract聲明;
-- 公開方法 : 介面中的方法都是公開方法, 不管有沒有public修飾;
-- 不完全公開 : 介面中的方法在包內是公開的, 如果沒有public修飾, 包內可以訪問, 但是包外不能訪問, 如果想要在包外訪問該介面, 需要使用public修飾;
-- 介面繼承: 介面A 可以 繼承另一個介面B, 例如 List 介面就繼承了 Collection 介面;
-- 介面不一定有方法 : 沒有方法的介面可以成為標記介面, 標記介面的作用 - 一個介面處於很高的繼承層次, 其方法不一定適用所有的類, 如果我們希望這個繼承體系存在, 可以建立一個標記介面, 其中不定義任何方法;
-- 介面欄位 : 介面中只能聲明 static final 欄位, 在介面實作類別中可以直接調用這些欄位, 其它的執行個體欄位不能再介面中聲明;
-- 介面建構函式 : 介面中不能定義建構函式, 如果定義了就會使實作類別中必須實現這一特定建構函式, 不實用;
2. 介面與職責
介面的優勢 : 介面限制了對象之間的互動過程, 這樣的好處是即使介面的實作類別發生了巨大的變化, 介面還是不會改變的, 調用介面的類仍正常運行;
-- eg : 在上面的 Panzer 實作類別編寫的時候, 開發人員必須實現該介面的三個方法, 這是必須遵循方法制定的契約;
實作類別不必實現所有方法 : 實作類別可以忽略介面中某些抽象類別的調用, 但是必須提供一個空的方法體, 換言之, 介面還是要實現的, 但是可以不使用;
-- 樁的概念 : stub, 樁 是介面的實作類別, 實現了類中的所有的方法, 但是這些方法都沒有方法體, 沒有實際意義;
-- 樁的作用 : 開發人員如果實現一個介面的話, 需要將所有的抽象方法都實現一遍, 寫起來很麻煩, 代碼也很冗餘, 這裡可以繼承 樁 , 然後實現自己感興趣的方法;
介面聲明常量 : 介面中只能存放 static final 類型的常量, 不能聲明 變數, 如果定義一個 "String str;" 就會報錯;
public interface Panzer {public static final String TANK_1 = "KV";public static final String CANNON_1 = "SU-51";abstract int getSpeed();//擷取速度public double getCaliber();//擷取口徑void fire();//開火}
枚舉 : 通常在介面中將有分組類別的常量定義為枚舉 enum;
.
3. 不同情境的介面應用
適配器模式 : 適配類的介面 以 匹配用戶端期待的介面; 如 類A 實現了需求, 但是其方法名不符合介面, 這裡就需要使用適配器模式;
面板模式 : 為一組類 提供一個 簡單介面;
合成模式 : 為單個對象與綜合物件提供統一的介面;
橋接模式 : 解除抽象與現實之間的耦合, 使二者能夠獨立演化;
.
.
作者 :萬境絕塵
轉載請註明出處 : http://blog.csdn.net/shulianghan/article/details/19028507
.