【面向對象設計模式】 接口型模式 (一)

.java

.架構

做者 :萬境絕塵 函數

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

..net


接口型模式組成 : 該模式包括適配器(Adapter)模式,外觀(Facade)模式,合成(Composite)模式,橋接(Bridge)模式 四種模式;code


類的接口對象

-- 前置條件 : 接口A, 類B, 類B實現接口A; blog

-- 容許訪問 : 類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

.

相關文章
相關標籤/搜索