天天看點

初探設計:Java接口和抽象類何時用?怎麼用?一、接口和抽象類二、為什麼有接口的兩大原因三、怎麼用?四、接口與抽象類的使用守則

今天犯了個錯:

“接口變動,傷筋動骨,除非你确定隻有你一個人在用”。哪怕隻是throw了一個新的exception。哈哈,這是我犯的錯誤。

類,即一個對象。

先抽象類,就是抽象出類的基礎部分,即抽象基類(抽象類)。官方定義讓人費解,但是記憶方法是也不錯的 — 包含抽象方法的類叫做抽象類。

接口就是把抽象的深度更深,它就像用簡短的非邏輯的一些規則表示類之間的關系。可以比作協定,比如通信使用的udp/tcp協定等。

小結:類與接口是java語言的基本抽象單元。

a. 向上轉型為多個基類型

如此,會給開發帶來相當大的靈活性。比如女神劉亦菲(class),實作了

明星 和 女人 的接口。這樣在複雜的繼承結構的某類中使用它,以後在調用seestar(star star)或者seewomen(women

women)方法時,隻要傳入其實作類(劉亦菲)即可。這也就是常說的接口可以多實作,達到了完全解耦。

b. 可複用性

即根據接口定義,讓建立類有了遵循的”協定“(規則)。whatever~ 要做的僅僅建立一個接口,為了保證生成對象的非耦合。如此而來,接口的使用讓代碼更具可複用性,通用性和靈活性。但并不是那麼萬能。後面使用守則會講到。

前人大牛總結了一些設計模式,也就是接口衍生出的一些設計模式。設計模式就是文法糖的甜蜜吧。接口讓我們嘗到了甜蜜。和我身邊的一杯starbucks的熱巧克力一樣。有點太甜。比如:

a.政策模式 — 方法中參數使用接口,傳入的參數對象(實作類)即包含了執行的代碼。如圖:

初探設計:Java接口和抽象類何時用?怎麼用?一、接口和抽象類二、為什麼有接口的兩大原因三、怎麼用?四、接口與抽象類的使用守則

調用過程如下,在方法中出入實作而已:

初探設計:Java接口和抽象類何時用?怎麼用?一、接口和抽象類二、為什麼有接口的兩大原因三、怎麼用?四、接口與抽象類的使用守則

b. 擴充卡模式 — 接口擴充卡(interface adapter)類,可以将不同源配到同一個目标。即暴露目标接口和實作源有共同的方法,擴充卡類怎麼适配呢?實作目标接口,并關聯了實作源對象,在實作方法中調用關聯實作源真正對象,然後在裡面進行各種适配操作。比如再關聯一個源什麼的。如圖:

初探設計:Java接口和抽象類何時用?怎麼用?一、接口和抽象類二、為什麼有接口的兩大原因三、怎麼用?四、接口與抽象類的使用守則

這其實有點aop的味道。比如spring aop架構對beforeadvice、afteradvice、throwsadvice三種通知類型的支援實際上是借助擴充卡模式來實作的。

c. 工廠模式 — 工廠對象将生成接口某個實作的對象。進而代碼将實作和接口的實作分離,比較透明地将某個實作透明地替換成另一個實作。但是這裡工廠調用方法是靜态的,也就是簡單工廠模式(靜态工廠模式)。動态工廠模式無非是使用了反射達到了動态調用。

第一、盡可能使每一個類或成員不被外界通路

這裡的外界有個度,比如包級或者公有的。這樣子可以更好地子產品化,子產品與子產品之間通過暴露的api調動。這樣如果有個子產品改動接口或者類。隻要擔心該子產品,而不會涉及其他子產品。

第二、适當的使用類(抽象類)繼承,更多的使用複合

繼承,實作了代碼重用。内部中使用繼承非常安全,但是要記住什麼時候使用繼承。即當子類真正是超類的子類型時,才适用繼承。否則盡可能使用複合,即在一個類中引用另一個類的執行個體。也就是說将另一個類包裝了一下,這也就是裝飾模式所展現的。

第三、優先考慮使用接口,相比抽象類

首先java隻許單繼承,這導緻抽象類定義收到極大的限制。二者,接口無法實作方法。但是java 8提供了函數式接口。

但是接口在設計的時候注意,設計公有接口必須謹慎。接口如果被公開發行,則肯定會被廣泛實作,那樣改接口幾乎不可能,會是巨大的工程。(這和我犯的錯誤一樣。)

第四、占時沒有第四了…

明白了 java接口和抽象類何時用?怎麼用?待續,有新的點補充吧