初探設計:Java接口和抽象類何時用?怎么用?


今天犯了個錯:

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

 

一、接口和抽象類

類,即一個對象

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

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

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

 

二、為什么有接口的兩大原因

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

如此,會給開發帶來相當大的靈活性。比如女神劉亦菲(Class),實現了 明星 和 女人 的接口。這樣在復雜的繼承結構的某類中使用它,以后在調用seeStar(Star star)或者seeWomen(Women women)方法時,只要傳入其實現類(劉亦菲)即可。這也就是常說的接口可以多實現,達到了完全解耦

b. 可復用性

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

 

三、怎么用?

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

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

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

image

 

b. 適配器模式 — 接口適配器(Interface Adapter)類,可以將不同源配到同一個目標。即暴露目標接口和實現源有共同的方法,適配器類怎么適配呢?實現目標接口,並關聯了實現源對象,在實現方法中調用關聯實現源真正對象,然后在里面進行各種適配操作。比如再關聯一個源什么的。如圖:

image

這其實有點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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM