今天犯了個錯:
“接口變動,傷筋動骨,除非你確定只有你一個人在用”。哪怕只是throw了一個新的Exception。哈哈,這是我犯的錯誤。
一、接口和抽象類
類,即一個對象。
先抽象類,就是抽象出類的基礎部分,即抽象基類(抽象類)。官方定義讓人費解,但是記憶方法是也不錯的 — 包含抽象方法的類叫做抽象類。
接口就是把抽象的深度更深,它就像用簡短的非邏輯的一些規則表示類之間的關系。可以比作協議,比如通信使用的UDP/TCP協議等。
小結:類與接口是Java語言的基本抽象單元。
二、為什么有接口的兩大原因
a. 向上轉型為多個基類型
如此,會給開發帶來相當大的靈活性。比如女神劉亦菲(Class),實現了 明星 和 女人 的接口。這樣在復雜的繼承結構的某類中使用它,以后在調用seeStar(Star star)或者seeWomen(Women women)方法時,只要傳入其實現類(劉亦菲)即可。這也就是常說的接口可以多實現,達到了完全解耦。
b. 可復用性
即根據接口定義,讓創建類有了遵循的”協議“(規則)。whatever~ 要做的僅僅建立一個接口,為了保證生成對象的非耦合。如此而來,接口的使用讓代碼更具可復用性,通用性和靈活性。但並不是那么萬能。后面使用守則會講到。
三、怎么用?
前人大牛總結了一些設計模式,也就是接口衍生出的一些設計模式。設計模式就是語法糖的甜蜜吧。接口讓我們嘗到了甜蜜。和我身邊的一杯starBucks的熱巧克力一樣。有點太甜。比如:
a.策略模式 — 方法中參數使用接口,傳入的參數對象(實現類)即包含了執行的代碼。如圖:
b. 適配器模式 — 接口適配器(Interface Adapter)類,可以將不同源配到同一個目標。即暴露目標接口和實現源有共同的方法,適配器類怎么適配呢?實現目標接口,並關聯了實現源對象,在實現方法中調用關聯實現源真正對象,然后在里面進行各種適配操作。比如再關聯一個源什么的。如圖:
這其實有點AOP的味道。比如Spring AOP框架對BeforeAdvice、AfterAdvice、ThrowsAdvice三種通知類型的支持實際上是借助適配器模式來實現的。
c. 工廠模式 — 工廠對象將生成接口某個實現的對象。從而代碼將實現和接口的實現分離,比較透明地將某個實現透明地替換成另一個實現。但是這里工廠調用方法是靜態的,也就是簡單工廠模式(靜態工廠模式)。動態工廠模式無非是使用了反射達到了動態調用。
四、接口與抽象類的使用守則
第一、盡可能使每一個類或成員不被外界訪問
這里的外界有個度,比如包級或者公有的。這樣子可以更好地模塊化,模塊與模塊之間通過暴露的api調動。這樣如果有個模塊改動接口或者類。只要擔心該模塊,而不會涉及其他模塊。
第二、適當的使用類(抽象類)繼承,更多的使用復合
繼承,實現了代碼重用。內部中使用繼承非常安全,但是要記住什么時候使用繼承。即當子類真正是超類的子類型時,才適用繼承。否則盡可能使用復合,即在一個類中引用另一個類的實例。也就是說將另一個類包裝了一下,這也就是裝飾模式所體現的。
第三、優先考慮使用接口,相比抽象類
首先Java只許單繼承,這導致抽象類定義收到極大的限制。二者,接口無法實現方法。但是Java 8提供了函數式接口。
但是接口在設計的時候注意,設計公有接口必須謹慎。接口如果被公開發行,則肯定會被廣泛實現,那樣改接口幾乎不可能,會是巨大的工程。(這和我犯的錯誤一樣。)
第四、占時沒有第四了…
小結:
明白了 Java接口和抽象類何時用?怎么用?待續,有新的點補充吧
歡迎點擊我的博客及GitHub — 博客提供RSS訂閱哦!
———- http://www.bysocket.com/ ————- https://github.com/JeffLi1993 ———-
微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter :BYSocket



