首頁 Java java教程 Java面向介面程式設計的範例詳解

Java面向介面程式設計的範例詳解

Sep 20, 2017 am 10:24 AM
java 範例 程式設計

本文透過結合介面的本質、物件導向程式設計與面向介面程式設計的關係以及一些作者自身的理解,向大家介紹了面向介面程式設計的一些東西,需要的朋友可以了解下。

我想,對於各位使用物件導向程式語言的程式設計師來說,「介面」這個名詞一定不陌生,但是不知各位有沒有這樣的疑惑:介面有什麼用途?它和抽象類別有什麼區別?能不能用抽象類別代替介面呢?而且,身為程式設計師,一定常常聽到「面向介面程式設計」這個短語,那麼它是什麼意思?有什麼思想內涵?和物件導向程式設計是什麼關係?本文將一一解答這些疑問。

1.針對介面程式設計與物件導向程式設計是什麼關係

#首先,以介面程式設計與物件導向程式設計並不是平級的,它並不是比物件導向程式設計更先進的一種獨立的程式設計思想,而是附屬於物件導向思想體系,屬於其一部分。或者說,它是物件導向程式設計體系中的思想精髓之一。

2.接口的本質

接口,在表面上是由幾個沒有主體程式碼的方法定義組成的集合體,有唯一的名稱,可以被類別或其他介面所實現(或者也可以說繼承)。它在形式上可能是如下的樣子:


interface InterfaceName
{
void Method1();
void Method2(int para1);
void Method3(string para2,string para3);
}
登入後複製

那麼,介面的本質是什麼呢?或者說介面存在的意義是什麼。我認為可以從以下兩個視角來考慮:

1)介面是一組規則的集合,它規定了實作本介面的類別或介面必須擁有的一組規則。 體現了自然界「如果你是…則必須能…」的理念。

例如,在自然界中,人都能吃飯,即「如果你是人,就必須能吃飯」。那麼模擬到電腦程式中,就應該有一個IPerson(習慣上,介面名稱由「I」開頭)接口,並有一個方法叫Eat(),然後我們規定,每一個表示「人」的類,必須實現IPerson接口,這就模擬了自然界「如果你是人,就必須能吃」這條規則。

從這裡,我想各位也能看到些許物件導向思想的東西。物件導向思想的核心之一,就是模擬真實世界,把真實世界中的事物抽象成類,整個程式靠各個類別的實例互相通訊、互相協作完成系統功能,這非常符合真實世界的運作狀況,也是面向對象思想的精髓。

2)介面是在一定粒度視圖上同類事物的抽象表示。 注意這裡我強調了在某一粒度視圖上,因為「同類事物」這個概念是相對的,它因為粒度視圖不同而不同。

例如,在我的眼裡,我是一個人,和一頭豬有本質區別,我可以接受我和我同學是同類這個說法,但絕不能接受我和一頭豬是同類。但是,如果在一個動物學家眼裡,我和豬應該是同類,因為我們都是動物,他可以認為“人”和“豬”都實現了IAnimal這個接口,而他在研究動物行為時,不會把我和豬分開對待,而會從「動物」這個較大的粒度上研究,但他會認為我和一棵樹有本質區別。

現在換了一個遺傳學家,情況又不同了,因為生物都能遺傳,所以在他眼裡,我不僅和豬沒區別,和一隻蚊子、一個細菌、一樹、一個蘑菇甚至一個SARS病毒都沒什麼區別,因為他會認為我們都實現了IDescendable這個介面(註:descend vi. 遺傳),即我們都是可遺傳的東西,他不會分別研究我們,而會將所有生物當作同類進行研究,在他眼裡沒有人和病毒之分,只有可遺傳的物質和不可遺傳的物質。但至少,我和一塊石頭還是有差別的。

可不幸的事情發生了,某日,地球上出現了一位偉大的人,他叫列寧,他在熟讀馬克思、恩格斯的辯證唯物主義思想巨著後,頗有心得,於是他下了一個著名的定義:所謂物質,就是能被意識所反映的客觀實在。至此,我和一塊石頭、一絲空氣、一條成語和傳輸手機訊號的電磁場已經沒什麼區別了,因為在列寧的眼裡,我們都是可以被意識所反映的客觀實在。如果列寧是程式設計師,他會這麼說:所謂物質,就是所有同時實作了「IReflectabe」和「IEsse」兩個介面的類別所產生的實例。 (註:reflect v. 反映 esse n. 客觀實在)

也許你會覺得我上面的例子像在瞎掰,但是,這正是介面得以存在的意義。物件導向思想和核心之一叫做多態性,什麼叫多態性?說穿了就是在某個粒度視圖層面上對同類事物不加區別的對待而統一處理。而之所以敢這樣做,就是因為有介面的存在。像那個遺傳學家,他明白所有生物都實現了IDescendable接口,那隻要是生物,一定有Descend()這個方法,於是他就可以統一研究,而不至於分別研究每一種生物而最終累死。

可能這裡還不能給你一個關於介面本質和作用的直覺印象。那麼在後文的例子和幾個設計模式的解析中,你將會更直觀地體驗到介面的內涵。

3.面向介面程式設計綜述

透過上文,我想大家對介面與介面的思想內涵有了一個了解,那麼什麼是面向介面程式設計呢?我個人的定義是:在系統分析和架構中,分清層次和依賴關係,每個層次不是直接向其上層提供服務(即不是直接實例化在上層中),而是透過定義一組接口,僅向上層暴露其介面功能,上層對於下層僅是介面依賴,而不依賴具體類別。

這樣做的好處是顯而易見的,首先對系統彈性大有好處。當下層需要改變時,只要介面及介面功能不變,則上層不用做任何修改。甚至可以在不改動上層程式碼時將下層整個替換掉,就像我們將一個WD的60G硬碟換成一個希捷的160G的硬碟,電腦其他地方不用做任何改動,而是把原硬碟拔下來、新硬碟插上就行了,因為電腦其他部分不依賴具體硬碟,而只依賴一個IDE接口,只要硬碟實現了這個接口,就可以替換上去。從這裡看,程式中的介面和現實中的介面極為相似,所以我一直認為,介面(interface)這個字用的真是神似!

使用介面的另一個好處就是不同部件或層次的開發人員可以並行開工,就像造硬碟的不用等造CPU的,也不用等造顯示器的,只要介面一致,設計合理,完全可以並行開發,從而提高效率。

本篇先到這裡。最後我想再囉嗦一句:物件導向的精髓是模擬現實,這也可以說是我這篇文章的靈魂。所以,多從現實中思考物件導向的東西,對提升系統分析設計能力大有脾臟。

下篇文章,我將用一個實例來展示介面程式設計的基本方法。

而第三篇,我將解析經典設計模式中的一些面向介面程式設計思想,並解析一下.NET分層架構中的面向介面思想。

1.關於「面向介面程式設計」中的「介面」與具體物件導向語言中「介面」兩個字

看到有朋友提出「面向介面程式設計」中的「介面」二字應該比單純程式語言中的interface範圍更大。我經過思考,覺得很有道理。這裡我寫的確實不太合理。我想,物件導向語言中的「介面」是指具體的一種程式碼結構,例如C#中用interface關鍵字定義的介面。而「面向介面程式設計」中的「介面」可以說是一種從軟體架構的角度、從一個更抽象的層面上指那種用來隱藏特定底層類別和實現多態性的結構部件。從這個意義上說,如果定義一個抽象類,並且目的是為了實現多態,那麼我認為把這個抽象類別也稱為「介面」是合理的。但是用抽象類別實現多態合理不合理?在下面第二條討論。

概括來說,我覺得兩個「介面」的概念既相互區別又相互連結。 「面向介面程式設計」中的介面是一種思想層面的用於實現多態性、提高軟體靈活性和可維護性的架構部件,而具體語言中的「介面」是將這種思想中的部件具體實施到程式碼裡的手段。

2.關於抽象類別與介面

在看到回覆中這是討論的比較激烈的一個問題。很抱歉我考慮不周沒有在文章中討論這個問題。我個人對這個問題的理解如下:
如果單從具體程式碼來看,對這兩個概念很容易模糊,甚至覺得介面就是多餘的,因為單從具體功能來看,除多重繼承外(C# ,Java中),抽象類別似乎完全能取代介面。但是,難道介面的存在是為了實現多重繼承?當然不是。我認為,抽象類別和介面的區別在於使用動機。使用抽象類別是為了程式碼的複用,而使用介面的動機是為了實現多態性。所以,如果你在為某個地方該使用介面還是抽象類別而猶豫不決時,那麼可以想想你的動機是什麼。

看到有朋友對IPerson這個介面的質疑,我個人的理解是,IPerson這個介面該不該定義,關鍵看具體應用中是怎麼個狀況。如果我們的專案中有Women和Man,都繼承Person,而且Women和Man絕大多數方法都相同,只有一個方法

DoSomethingInWC()不同(例子比較粗俗,各位見諒),那麼當然定義一個AbstractPerson抽象類別比較合理,因為它可以把其他所有方法都包含進去,子類別只定義DoSomethingInWC(),大大減少了重複程式碼量。

但是,如果我們程式中的Women和Man兩個類別基本上沒有共同程式碼,而且有一個PersonH​​andle類別需要實例化他們,不希望知道他們是男是女,而只需把他們當作人看待,並實現多態,那麼定義成介面就有必要了。

總而言之,介面與抽象類別的差異主要在於使用的動機,而不在於其本身。而一個東西該定義成抽象類別還是接口,要根據具體環境的上下文來決定。

再者,我認為介面和抽象類別的另一個區別在於,抽象類別和它的子類別之間應該是一般和特殊的關係,而介面只是它的子類別應該實現的一組規則。 (當然,有時也可能存在一般與特殊的關係,但我們使用介面的目的不在這裡)如,交通工具定義成抽象類,汽車、飛機、輪船定義成子類,是可以接受的,因為汽車、飛機、輪船都是一種特殊的交通工具。再譬如Icomparable接口,它只是說,實現這個接口的類別必須要可以進行比較,這是一條規則。如果Car這個類別實現了Icomparable,只是說,我們的Car中有一個方法可以對兩個Car的實例進行比較,可能是比哪輛車更貴,也可能比哪輛車更大,這都無所謂,但我們不能說“汽車是一種特殊的可以比較”,這在文法上都不通。

總結

總的來說,介面程式導向的意思是指在物件導向的系統中所有的類別或模組之間的交互是由介面完成的。

以上是Java面向介面程式設計的範例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

編碼的關鍵:為初學者釋放 Python 的力量 編碼的關鍵:為初學者釋放 Python 的力量 Oct 11, 2024 pm 12:17 PM

Python透過其易學性和​​強大功能,是初學者的理想程式設計入門語言。其基礎包括:變數:用於儲存資料(數字、字串、列表等)。資料型態:定義變數中資料的型態(整數、浮點數等)。運算符:用於數學運算和比較。控制流程:控製程式碼執行流程(條件語句、迴圈)。

使用 Python 解決問題:作為初學者,解鎖強大的解決方案 使用 Python 解決問題:作為初學者,解鎖強大的解決方案 Oct 11, 2024 pm 08:58 PM

Python 讓初學者能夠解決問題。

揭秘 C:為新程式設計師提供一條清晰簡單的道路 揭秘 C:為新程式設計師提供一條清晰簡單的道路 Oct 11, 2024 pm 10:47 PM

C是初學者學習系統程式設計的理想選擇,它包含以下元件:頭檔、函數和主函數。一個簡單的C程式可以列印“HelloWorld”,需要包含標準輸入/輸出函數聲明的頭文件,並在主函數中使用printf函數來列印。透過使用GCC編譯器可以編譯和執行C程式。掌握基礎後,可以繼續學習資料類型、函數、陣列和文件處理等主題,以成為熟練的C程式設計師。

釋放你內心的程式設計師:C 絕對初學者 釋放你內心的程式設計師:C 絕對初學者 Oct 11, 2024 pm 03:50 PM

C語言是初學者學習程式設計的理想選擇,其優點包括效率、多功能性和可移植性。學習C語言需要:安裝C編譯器(如MinGW或Cygwin)了解變數、資料型別、條件語句和迴圈語句編寫包含主函數和printf()函數的第一個程式透過實戰案例(如計算平均數)練習C語言知識

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

如何在Spring Tool Suite中運行第一個春季啟動應用程序? 如何在Spring Tool Suite中運行第一個春季啟動應用程序? Feb 07, 2025 pm 12:11 PM

Spring Boot簡化了可靠,可擴展和生產就緒的Java應用的創建,從而徹底改變了Java開發。 它的“慣例慣例”方法(春季生態系統固有的慣例),最小化手動設置

See all articles