面向介面程式設計的一些總結
1.面向介面程式設計產生的背景
在一個面向物件的系統中,系統的各種功能是由許許多多的不同物件協作完成,在這種情況下各個物件內部是如何實現自己對系統設計人員來說就不那麼重要了.而各個物件之間的協作關係則成為系統設計的關鍵,在日常工作中,如果別人修改的程式碼頻繁的影響到你,表現在某個模組的改動引起其他模組的大規模調整,說明模組介面沒有很好的設計.所有面向介面程式設計顯得尤為重要.
2.什麼是面向介面程式設計?
面向介面程式設計就是先把客戶的業務邏輯線提取出來,作為介面,業務具體實現通過該介面的實現來完成.當客戶需求變化的時候,只需編寫該業務邏輯的新的實現類,通過更改配置檔案(例如Spring框架)中該介面的實現類就可以完成需求,不需要修改現有的程式碼,減少對系統的影響
3.面向介面程式設計的優點?
1.降低程式的耦合性,能夠最大限度的解耦合
2.易於程式的擴充套件
3.有利於程式的維護
4.介面程式設計在設計模式中的體現:開閉原則
那麼是麼是開閉原則呢?一句話概括:對擴充套件開放,對修改關閉.
開放封閉原則的簡單概述:開放-封閉原則是面向物件設計的核心所在.遵循這個原則可以帶來面向物件技術所聲稱的巨大好處:
可維護 可擴充套件 可複用 靈活性好
開發人員應該僅對程式中呈現出頻繁的變化那部分作出抽象,然而對於應用程式中的每個部分進行刻意的抽象同樣並不是一個好主意,拒絕不成熟的抽象和抽象本身一樣重要(切記,切記).
面向介面將具體邏輯與實現分開,減少了各個類之間的相互依賴,當各個類變化時候,不需要對已經編寫的類進行改動,新增新的實現類可以了,不用擔心新改動的類對系統的其他模組造成影響
5.關於抽象類的設計是如何體現多型的?
靜態型別語言通常設計為可以“向上轉型”。當給一個類變數賦值時,這個變數的型別既可以使用這個類本身,也可以使用這個類的超類。就像看到天上有隻麻雀,既可以說“一隻麻雀在飛”,也可以說“一隻鳥在飛”,甚至可以說成“一隻動物在飛”。通過向上轉型,物件的具體型別被隱藏在“超型別”身後。當物件型別之間的耦合關係被解除之後,這些物件才能在型別檢查系統的監視下相互替換使用,這樣才能看到物件的多型性
抽象類的一些作用:
1.向上轉型
舉例:
讓麻雀物件和鴨子物件的型別都隱藏在抽象類Dird型別之後,隱藏物件的的具體型別之後,麻雀和鴨子才能被交換使用,這是讓物件表現出多型性的必經之路
2.建立一些契約繼承自抽象類的具體類都會繼承抽象類裡的abstract方法,並且要求覆寫它們。這些契約在實際程式設計中非常重要,可以幫助編寫可靠性更高的程式碼。
比如在命令模式中,各個子命令類都必須實現execute方法,才能保證在呼叫command.execute的時候不會丟擲異常。如果讓子命令類OpenTvCommand繼承自抽象類Command:
abstract class Command{
public abstract void execute();
}
public class OpenTvCommand extends Command{
public OpenTvCommand (){};
public void execute(){
System.out.println( "開啟電視機" );
}
}
自然有編譯器幫助檢查和保證子命令類OpenTvCommand覆寫了抽象類Command中的execute抽象方法。如果沒有這樣做,編譯器會盡可能早地丟擲錯誤來提醒正在編寫這段程式碼的程式設計師
總而言之,不關注物件的具體型別,而僅僅針對超型別中的“契約方法”來編寫程式,可以產生可靠性高的程式,也可以極大地減少子系統實現之間的相互依賴關係,這就是面向介面程式設計
6.使用抽象類還是介面?
分析: 在使用介面的同時仍舊可以使用抽象類,不過這時抽象類的作用是實現行為,而不是定義行為.只要實現行為的類遵從介面定義,即使它改變了父抽象類,也不用改變其它程式碼與之互動的方式。特別是對於公用的實現程式碼,抽象類有它的優點。抽象類能夠保證實現的層次關係,避免程式碼重複。然而,即使在使用抽象類的場合,也不要忽視通過介面定義行為模型的原則。從實踐的角度來看,如果依賴於抽象類來定義行為,往往導致過於複雜的繼承關係,而通過介面定義行為能夠更有效地分離行為與實現,為程式碼的維護和修改帶來方便。
行為模型要通過介面定義而不是抽象類. 抽象類結合介面使用,抽象類的作用是實現行為,而不是定義行為.
採用介面還是抽象類參考一下兩點:
1. 如果要建立不帶任何方法定義和成員變數的基類,那麼就應該選擇介面而不是抽象類。
2. 如果知道某個類應該是基類,那麼第一個選擇的應該是讓它成為一個介面,只有在必須要有方法定義和成員 變數的時候,才應該選擇抽象類。因為抽象類中允許存在一個或多個被具體實現的方法,只要方法沒有被全部 實現該類就仍是抽象類。
7.關於介面特性的一些整理
1. 介面中的方法可以有引數列表和返回型別,但不能有任何方法體。
2. 介面中可以包含欄位,但是會被隱式的宣告為static和final。
3. 介面中的欄位只是被儲存在該介面的靜態儲存區域內,而不屬於該介面。
4. 介面中的方法可以被宣告為public或不宣告,但結果都會按照public型別處理。
5. 當實現一個介面時,需要將被定義的方法宣告為public型別的,否則為預設訪問型別,Java編譯器不允許這種情況。
6. 如果沒有實現介面中所有方法,那麼建立的仍然是一個介面。
7. 擴充套件一個介面來生成新的介面應使用關鍵字extends,實現一個介面使用implements。