文章同步於blog
大家一定都有自己建立物件的經驗
但你有沒有想過
當今天我們要修改建立物件的內容的時候
面臨到要改的範圍過大的問題
今天我們可以使用依賴注入(Dependency Injection, DI)的方式,來規範我們的Class
DI到底是什麼呢
這是一種設計模式,傳統上當我需要某個物件的時候
我就會直接建立他,而這個狀況會有一個壞處就是,有時當我修改原本的被建立物件的function,我就必須大規模修改我的程式碼
例如說
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
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) 來解除強耦合吧
依賴注入