六邊形架構——DDD 的最佳搭檔
看到上篇 DDD 的四層架構文章反響不錯,今天再來談談另外一種架構 ---「六邊形架構」。
提到領域驅動設計(DDD),大家第一反應是啥?“聽起來很高大上,但我沒用過” 對吧?別急,今天我們不聊那些聽着頭大、看着困的定義,咱們直接來點乾貨,講講 DDD 中最常見、也最實用的架構——六邊形架構(Hexagonal Architecture)。
別看它名字挺科幻,其實很接地氣。想象一下,你在玩一款特別經典的遊戲《俄羅斯方塊》。這遊戲看着簡單吧?但其實它的核心玩法(即不斷拼接落下來的方塊)是永遠不變的,而那些花裏胡哨的控制方式(比如按鍵、手勢、甚至腦電波)可以不斷更換。這其實就是六邊形架構的精髓——「把核心邏輯和外部依賴分離」。
什麼是六邊形架構?
六邊形架構,又叫**「端口和適配器架構」**。顧名思義,它的設計理念就是像六邊形那樣,把系統核心(業務邏輯)包裹在中間,周圍的每個 “邊” 都是一個端口,用來和外界通訊。外部系統要想跟核心打交道,必須通過這些端口來適配。
簡單點說,「業務核心是國王,所有外部系統(像數據庫、UI、API 等)都是國王的臣民,臣民得通過王宮的門才能拜見國王」,而國王絕對不會自己走出王宮去見臣民。因爲這可是國王嘛,要有派頭!
六邊形架構的特點
既然有國王和臣民,這就有了職責分明的架構特點:
-
「業務核心獨立」:核心的業務邏輯被放在 “王宮” 裏,它不依賴任何具體的技術,比如數據庫、UI、消息隊列等。換句話說,核心邏輯只關心“我該做什麼”,而不關心“我怎麼做”。
-
「可替換的外部接口」:外部系統(比如數據庫、UI)都是通過端口和適配器與業務核心連接的。如果你哪天心血來潮想換掉數據庫,或者把 UI 從 Vue 換成 React,只需要換掉適配器,不影響核心邏輯。
-
「測試友好」:六邊形架構中,核心業務邏輯和外部系統分離得很乾淨,這讓單元測試變得特別方便。測試時,只需要模擬端口,根本不需要依賴數據庫、網絡請求等外部因素。
爲什麼叫 “六邊形”?
你可能好奇,爲什麼非要叫六邊形,而不是四邊形或者八邊形呢?其實,“六邊形” 純粹是爲了畫圖方便,顯得酷炫罷了。實際中,這些端口的數量是可變的,你可以有四邊、五邊甚至更多邊,但不管幾邊,原則不變——「核心邏輯在中間,外部依賴在邊緣,通過端口適配溝通」。
實戰一下六邊形架構
話不多說,咱們直接上代碼!假設我們要做一個電商系統中的 “下訂單” 功能。
- 「核心邏輯(領域層)」:
public class OrderService {
public void placeOrder(Order order) {
// 核心業務邏輯,比如驗證庫存、計算運費等
System.out.println("Processing order: " + order.getId());
}
}
- 「端口(接口層)」:
public interface OrderRepository {
void save(Order order);
}
- 「適配器(基礎設施層)」: 假設我們用 MySQL 存儲訂單,寫個適配器:
public class MySqlOrderRepository implements OrderRepository {
@Override
public void save(Order order) {
// 假裝這裏是數據庫操作
System.out.println("Saving order to MySQL: " + order.getId());
}
}
- 「接口適配」: 假設我們有一個 Web API 用來接收訂單請求:
public class OrderController {
private final OrderService orderService;
private final OrderRepository orderRepository;
public OrderController(OrderService orderService, OrderRepository orderRepository) {
this.orderService = orderService;
this.orderRepository = orderRepository;
}
public void placeOrder(Order order) {
orderService.placeOrder(order);
orderRepository.save(order);
}
}
在這個例子中,OrderService
是核心邏輯,它不關心訂單存在哪個數據庫中,也不在乎訂單是通過 Web 請求還是別的方式進來的。所有的這些外部系統通過接口(端口)連接,然後由具體的 MySQL 實現(適配器)來完成。
六邊形架構帶來的好處
-
「靈活應對變化」:你可以隨時更換適配器,比如把數據庫從 MySQL 換成 MongoDB,甚至把 Web API 換成消息隊列,核心邏輯完全不受影響。
-
「可測試性強」:業務邏輯的獨立性讓你可以輕鬆編寫單元測試,不用擔心數據庫或網絡不在線的問題。
-
「架構清晰」:職責分明,核心邏輯和技術細節各司其職,不會互相干擾。
總結
六邊形架構就是 DDD 的最佳拍檔,它讓你能夠更好地管理複雜的業務邏輯,同時保持系統的靈活性和可擴展性。雖然名字看起來複雜,但背後的理念非常簡單:「核心邏輯至高無上,所有外部系統都得通過指定端口拜見」。
所以,別再覺得 DDD 是個只存在於象牙塔裏的概念了,用上六邊形架構,你也能輕鬆駕馭它,讓你的代碼既高效又優雅!
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/0DTTbvSQZX2m-tMQ9U3Rhw