閱讀971 返回首頁    go 技術社區[雲棲]


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

接口型模式組成 : 該模式包括適配器(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架構;


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

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. public interface Panzer {  
  2.       
  3.     abstract int getSpeed();    //獲取速度  
  4.     public double getCaliber(); //獲取口徑  
  5.     void fire();                //開火  
  6.       
  7. }  


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

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

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

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

-- 接口繼承: 接口A 可以 繼承另一個接口B, 例如 List 接口就繼承了 Collection 接口;

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

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

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



2. 接口與職責


接口的優勢 : 接口限製了對象之間的交互過程, 這樣的好處是即使接口的實現類發生了巨大的變化, 接口還是不會改變的, 調用接口的類仍正常運行;

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


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

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

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


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

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. public interface Panzer {  
  2.       
  3.     public static final String TANK_1 = "KV";  
  4.     public static final String CANNON_1 = "SU-51";  
  5.       
  6.     abstract int getSpeed();    //獲取速度  
  7.     public double getCaliber(); //獲取口徑  
  8.     void fire();                //開火  
  9.       
  10. }  

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

.


3. 不同場景的接口應用


適配器模式 : 適配類的接口 以 匹配客戶端期待的接口; 如 類A 實現了需求, 但是其方法名不符合接口, 這裏就需要使用適配器模式;

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

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

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

.

.

作者 :萬境絕塵 

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

最後更新:2017-04-03 12:55:24

  上一篇:go C# 自定義數字格式字符串 ToString ###,###,###,##0
  下一篇:go 初步理解getopt函數