依赖注入
使用接口来实现依赖注入,降低模块间的耦合。
概念: 依赖注入是一种设计模式,它允许你将组件的依赖关系(即其他组件或服务)从组件本身中分离出来,并在组件外部进行配置。这样做可以减少组件之间的耦合,使得代码更加模块化,易于测试和维护。
Go 语言实现: 在 Go 语言中,可以通过接口来实现依赖注入。接口定义了组件所需的行为,然后你可以在运行时注入任何实现了这些行为的具体类型。
优点:
- 降低耦合:组件不直接依赖于具体的实现类,而是依赖于接口,这降低了组件之间的耦合度。
- 提高灵活性:可以轻易地替换依赖的具体实现,而不需要修改组件的代码。
- 易于测试:可以为测试注入模拟对象(mocks),从而可以隔离测试组件,不依赖于外部服务或组件。
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
| package main
type Logger interface { Log(message string) }
type ConsoleLogger struct{}
func (l ConsoleLogger) Log(message string) { println("Log-DEBUG:", message) }
type ConsoleLoggerINFO struct{}
func (l ConsoleLoggerINFO) Log(message string) { println("Log-INFO:", message) }
type Application struct { logger Logger }
func (a *Application) SetLogger(logger Logger) { a.logger = logger }
func main() { app := Application{} consoleLogger := ConsoleLogger{} app.SetLogger(consoleLogger) app.logger.Log("Application started") consoleLoggerInfo := ConsoleLoggerINFO{} app.SetLogger(consoleLoggerInfo) }
|
上边通过Go语言的Logger接口包含了Log方法, Application包含了Logger接口。 Application可以通过SetLogger来设置任何实现接口中Log 方法的就,可以方便切换日志类型。这就是依赖注入,每个部分都是个组件,可以随意方便的更换