文章同步於it邦
前言
大家一定都有自己建立物件的經驗
但你有沒有想過
當今天我們要修改建立物件的內容的時候
面臨到要改的範圍過大的問題
今天我們可以使用依賴注入(Dependency Injection, DI)的方式,來規範我們的Class
簡介
DI到底是什麼呢
這是一種設計模式,傳統上當我需要某個物件的時候
我就會直接建立他,而這個狀況會有一個壞處就是,有時當我修改原本的被建立物件的function,我就必須大規模修改我的程式碼
例如說
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| package main
import ( "fmt" )
type Notifier interface { SendNotification(message string) }
type EmailNotifier struct{}
func (e *EmailNotifier) SendNotification(message string) { fmt.Printf("Email sent: %s\n", message) }
type OrderProcessor struct{}
func (op *OrderProcessor) ProcessOrder(orderID int) {
notifier := &EmailNotifier{} notifier.SendNotification(fmt.Sprintf("Order #%d processed", orderID)) }
func main() { orderProcessor := &OrderProcessor{} orderProcessor.ProcessOrder(123) }
|
雖然用Golang可能會不太明顯
不過還是將就一下
我們可以看到此時我們是在比較低階的模組去實體化我們的EmailNotifier
DI實作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package main
import ( "fmt" )
// 定義通知服務接口 type Notifier interface { SendNotification(message string) }
// EmailNotifier 實現了通知服務接口 type EmailNotifier struct{}
func (e *EmailNotifier) SendNotification(message string) { fmt.Printf("Email sent: %s\n", message) }
// 訂單處理,依賴通知服務 type OrderProcessor struct {}
func (op *OrderProcessor) ProcessOrder(orderID int, notifier Notifier) { // 處理訂單邏輯
// 發送通知 notifier.SendNotification(fmt.Sprintf("Order #%d processed", orderID)) }
func main() { // 創建 EmailNotifier 實例 notifier := &EmailNotifier{}
// 使用依賴注入,將通知服務傳遞給訂單處理 orderProcessor := &OrderProcessor{notifier}
// 處理訂單 orderProcessor.ProcessOrder(123) }
|
不過這樣僅僅只做到了將傳遞模組的工作交給更上層的main()
但只少這樣能夠先把依賴給稍微降低
參考資料
淺入淺出 Dependency Injection
菜雞新訓記 (6): 使用 依賴注入 (Dependency Injection) 來解除強耦合吧
依賴注入