天天看點

Java 設計模式 接口型模式 之 類型介紹 (一)

接口型模式組成 : 該模式包括擴充卡(adapter)模式,外觀(facade)模式,合成(composite)模式,橋接(bridge)模式 四種模式;

類的接口 : 

-- 前置條件 : 接口a, 類b, 類b實作接口a; 

-- 允許通路 : 類a允許其它類的對象可以通路類b的 方法 與 字段, 類a 是類b的接口; 

-- 實作關系 : 類b 方法需要實作 類a接口的方法名表示的操作, 類a 的實作就是 類b 中方法體的代碼; 

接口與實作的概念 : 接口 與 實作 二者是分離的, java允許多個類實作同一個接口, 提供相同的功能; 也允許一個類實作多個接口;

-- 接口: 對象必須遵循的承諾;

-- 實作 : 對象如果履行承諾;

接口與抽象類的差別 : 即使抽象類中全是抽象方法, 看起來與接口類似, 但是還是與接口有很大的不同;

-- 實作繼承個數 : 類a 可以實作多個接口, 但是隻能繼承一個抽象類;

-- 抽象方法個數 : 接口中必須都是抽象方法, 抽象類中可以包含具體方法;

-- 是否使用字段 : 接口中隻能建立 static final 常量字段, 抽象類中可以聲明和使用任何類型字段;

-- 方法的描述符 : 接口中方法必須是public修飾, 抽象類中可以是任何限定;

-- 是否構造函數 : 接口沒有構造函數, 抽象類可以有構造函數;

c語言與java在接口方面的差別 : c語言中隻有抽象類, 沒有接口, java語言中二者皆有; 

接口作用 : 如果不能使用接口, 完全可以使用抽象類來代替, 接口在多層開發中發揮很大作用, 例如在j2ee中的mvc架構;

實際例子 : 火炮 和 坦克 都屬于裝甲車, 二者的應用場合各有不同, 但是它們有相同之處, 可以定義成接口 :

[java] view

plaincopy

Java 設計模式 接口型模式 之 類型介紹 (一)
Java 設計模式 接口型模式 之 類型介紹 (一)

public interface panzer {  

    abstract int getspeed();    //擷取速度  

    public double getcaliber(); //擷取口徑  

    void fire();                //開火  

}  

從上面的例子列舉接口的一些特性 : 

-- 抽象方法 : 接口中的方法都是抽象方法, 不管有沒有abstract聲明;

-- 公開方法 : 接口中的方法都是公開方法, 不管有沒有public修飾;

-- 不完全公開 : 接口中的方法在包内是公開的, 如果沒有public修飾, 包内可以通路, 但是包外不能通路, 如果想要在包外通路該接口, 需要使用public修飾;

-- 接口繼承: 接口a 可以 繼承另一個接口b, 例如 list 接口就繼承了 collection 接口;

-- 接口不一定有方法 : 沒有方法的接口可以成為标記接口, 标記接口的作用 - 一個接口處于很高的繼承層次, 其方法不一定适用所有的類, 如果我們希望這個繼承體系存在, 可以建立一個标記接口, 其中不定義任何方法;

-- 接口字段 : 接口中隻能聲明 static final 字段, 在接口實作類中可以直接調用這些字段, 其它的執行個體字段不能再接口中聲明;

-- 接口構造函數 : 接口中不能定義構造函數, 如果定義了就會使實作類中必須實作這一特定構造函數, 不實用; 

接口的優勢 : 接口限制了對象之間的互動過程, 這樣的好處是即使接口的實作類發生了巨大的變化,

接口還是不會改變的, 調用接口的類仍正常運作;

-- eg : 在上面的 panzer 實作類編寫的時候, 開發者必須實作該接口的三個方法, 這是必須遵循方法制定的契約;

實作類不必實作所有方法 : 實作類可以忽略接口中某些抽象類的調用, 但是必須提供一個空的方法體, 換言之, 接口還是要實作的, 但是可以不使用;

-- 樁的概念 : stub, 樁 是接口的實作類, 實作了類中的所有的方法, 但是這些方法都沒有方法體, 沒有實際意義;

-- 樁的作用 : 開發者如果實作一個接口的話, 需要将所有的抽象方法都實作一遍, 寫起來很麻煩, 代碼也很備援, 這裡可以繼承 樁 , 然後實作自己感興趣的方法;

接口聲明常量 : 接口中隻能存放 static final 類型的常量, 不能聲明 變量, 如果定義一個 "string str;" 就會報錯;

Java 設計模式 接口型模式 之 類型介紹 (一)
Java 設計模式 接口型模式 之 類型介紹 (一)

    public static final string tank_1 = "kv";  

    public static final string cannon_1 = "su-51";  

枚舉 : 通常在接口中将有分組類别的常量定義為枚舉 enum;

.

擴充卡模式 : 适配類的接口 以 比對用戶端期待的接口; 如 類a 實作了需求, 但是其方法名不符合接口, 這裡就需要使用擴充卡模式;

外觀模式 : 為一組類 提供一個 簡單接口;

合成模式 : 為單個對象與複合對象提供統一的接口;

橋接模式 : 解除抽象與現實之間的耦合, 使二者能夠獨立演化;

作者 :萬境絕塵 

轉載請注明出處 : http://blog.csdn.net/shulianghan/article/details/19028507