在面向對象系統中,**對象間協作關系才是設計核心**,內部實現細節次之。接口編程即:**依賴抽象 (接口/抽象類),而非依賴具體實現**。這不僅是語法技巧,更是架構治理哲學。
| 維度 | 抽象體 | 抽象面 |
|---|---|---|
| 對應構造 | abstract class | interface (Java 8+ 可含 default/static 方法) |
| 語義 | 「是一種」核心身份,單繼承 | 「具有某能力」行為契約,多實現 |
| 包含內容 | 狀態 (字段) + 部分實現 + 抽象方法 | 純行為規範 (常量 + 方法簽名 + 默認實現) |
| 例子 | AbstractController 封裝通用 CRUD 流程 | Serializable, Comparable, PaymentProcessor |
一個實體類可繼承一個抽象體,實現多個抽象面:class User extends BaseEntity implements Serializable, Auditable, Exportable。
接口不存在於真空中。**環境 = 空間邊界 + 外部影響因素總和**。
UserService 接口,內部實現 UserServiceImpl、UserServiceMock 可熱插拔。OpenAPI/Swagger 定義 HTTP/JSON 契約,異構語言 (Java/Go/Python) 共同遵守。default 或新增接口 UserServiceV2,舊版本平滑共存。脫離環境談接口失去意義:**接口是系統在特定邊界處達成的協議**。
Component (組件)、Container (容器)、Connector (連接器) 三位一體:
缺一不可:**無接口無組件複用,無容器無依賴管理,無連接器無分佈式協作**。
| 範式 | 關注點 | 基本單位 | 接口角色 |
|---|---|---|---|
| 面向過程 | 流程步驟、數據流轉 | 函數/過程 | 模塊間函數簽名 (弱契約) |
| 面向對象 | 對象屬性與行為、封裝/繼承/多態 | 類/對象 | 類的公共方法 (隱式契約) |
| 面向接口 | **契約優先、依賴倒置、可替換性** | **接口/組件** | **顯式、獨立、版本化的協議** |
| 反模式 | 癥狀 | 重構方向 |
|---|---|---|
| 具體類依賴 | UserServiceImpl userService = new UserServiceImpl(); 到處 new | 注入 UserService 接口,IoC 容器管理實現 |
| 接口臃腫 | UserManager 含 50+ 方法:CRUD、權限、導入、導出、報表... | 拆分為 UserRepository, UserPermissionService, UserImportExport... |
| 洩露實現細節 | 接口返回 ArrayList、拋出 SQLException、參數含 Connection | 返回 List、轉換為業務異常、參數用領域對象 |
| 循環依賴 | A 依賴 B 接口,B 依賴 A 接口 | 抽出共享接口到獨立模塊、事件驅動解耦 |
面向接口編程不是「到處寫 interface 關鍵字」,而是**以契約為中心的系統構建哲學**:
掌握這種思維,你就能從「寫代碼的程序員」進化為「設計系統的架構師」:**代碼是負債,接口是資產**;**實現易變,契約長存**;**協作靠協議,不靠默契**。