假设我们正在开发一个日志系统,该系统需要支持多种日志输出方式,比如控制台输出、文件输出等。我们可以定义一个Logger接口,然后为每种日志输出方式实现这个接口。
package main
import (
"fmt"
)
type Logger interface {
Log(message string)
}
type ConsoleLogger struct{}
func (c ConsoleLogger) Log(message string) {
fmt.Println("ConsoleLogger:", message)
}
type FileLogger struct {
FileName string
}
func (f FileLogger) Log(message string) {
// 假装这里写入文件
fmt.Println("FileLogger writes to", f.FileName, ":", message)
}
func main() {
var logger Logger
// 使用控制台日志输出
logger = ConsoleLogger{}
logger.Log("This is a log message.")
// 使用文件日志输出
logger = FileLogger{FileName: "log.txt"}
logger.Log("This is another log message.")
}
在这个例子中,Logger接口使得我们的日志系统具有高内聚的特点:所有日志输出的实现都遵循同一个接口定义。
同时,由于我们依赖于Logger接口而不是具体的实现,系统的各部分之间耦合度低,我们可以轻松地添加新的日志输出方式,而不需要修改使用日志的代码