簡介
基於接口編程( Interface-based programming)也稱 基於接口的架構( interface-based architecture),它是一種在沒有模組系統的面向對象程式設計語言中的組件層面實現模組化編程的架構模式。匹配此例的一個語言是Java,截至2015年,它沒有組件級別的模組系統。Java有一個包(package)系統,但Java軟體組件通常由多個Java包組成——並且在任何情況下,接口編程可以提供優於僅使用Java包的優勢,即使組件僅由單個Java包組成。
基於接口的編程將應用程式定義為組件的集合,其中組件間的應用程式接口(API)調用可能只通過抽象化接口完成,而沒有具體的類。類的實例化一般通過使用如工廠模式等技術的其他接口完成。
這種方式被認為增加了應用程式的模組性並因而增加了可維護性。但是,有必要謹慎考慮——僅將應用程式分解成通過接口通信的任意組件本身不能保證低耦合性或高內聚性,這兩項通常被認為是可維護性的另外兩項關鍵屬性。
當第三方(或同一個組織內的另一個團隊)為已創建的系統開發了額外的組件或外掛程式時,可以使用基於接口體系結構。Eclipse IDE的代碼庫就是基於接口編程的一個例子。Eclipse外掛程式外掛程式供應商只需開發滿足父應用程式供應商Eclipse基金會指定接口的組件。在Eclipse中,哪怕“Java開發工具”等原始組件本身也是一個外掛程式。這有點像行動電話製造商制定的移動充電器接口(引腳布局、預期直流電電壓等)和,製造商和第三方都製造匹配這種標準接口規範的手機充電器。
接口的本質
接口,在表面上是由幾個沒有主體代碼的方法定義組成的集合體,有唯一的名稱,可以被類或其他接口所實現(或者也可以說繼承
1)接口是一組規則的集合,它規定了實現本接口的類或接口必須擁有的一組規則。
體現了自然界“如果你是……則必須能……”的理念。
例如,在自然界中,人都能吃飯,即“如果你是人,則必須能吃飯”。那么模擬到電腦程式中,就應該有一個IPerson(習慣上,接口名由“I”開頭)接口,並有一個方法叫Eat(),然後規定,每一個表示“人”的類,必須實現IPerson接口,這就模擬了自然界“如果你是人,則必須能吃飯”這條規則。
面向對象思想的核心之一,就是模擬真實世界,把真實世界中的事物抽象成類,整個程式靠各個類的實例互相通信、互相協作完成系統功能,這非常符合真實世界的運行狀況,也是面向對象思想的精髓。
2)接口是在一定粒度視圖上同類事物的抽象表示。
因為“同類事物”這個概念是相對的,它因為粒度視圖不同而不同。
接口得以存在的意義。面向對象思想和核心之一叫做多態性,就是在某個粒度視圖層面上對同類事物不加區別的對待而統一處理。
面向接口編程綜述
在系統分析和架構中,分清層次和依賴關係,每個層次不是直接向其上層提供服務(即不是直接實例化在上層中),而是通過定義一組接口,僅向上層暴露其接口功能,上層對於下層僅僅是接口依賴,而不依賴具體類。
這樣做的好處是顯而易見的,首先對系統靈活性大有好處。當下層需要改變時,只要接口及接口功能不變,則上層不用做任何修改。甚至可以在不改動上層代碼時將下層整個替換掉,使用接口的另一個好處就是不同部件或層次的開發人員可以並行開工,只要接口一致,設計合理,完全可以並行進行開發,從而提高效率。
面向對象語言中的“接口”是指具體的一種代碼結構,例如C#中用interface關鍵字定義的接口。而“面向接口編程”中的“接口”可以說是一種從軟體架構的角度、從一個更抽象的層面上指那種用於隱藏具體底層類和實現多態性的結構部件。
面向接口編程”中的接口是一種思想層面的用於實現多態性、提高軟體靈活性和可維護性的架構部件,而具體語言中的“接口”是將這種思想中的部件具體實施到代碼里的手段。如果單從具體代碼來看,對這兩個概念很容易模糊,甚至覺得接口就是多餘的,因為單從具體功能來看,除多重繼承外(C#,Java中),抽象類似乎完全能取代接口。但是,抽象類和接口的區別在於使用動機。使用抽象類是為了代碼的復用,而使用接口的動機是為了實現多態性。