您的位置:首页 >Golang装饰者模式扩展功能实践
发布于2026-02-06 阅读(0)
扫一扫,手机访问
装饰者模式通过接口和组合实现功能扩展,定义统一接口后,使用包装器在不修改原对象的情况下动态添加日志、缓存等行为,支持链式叠加多个装饰器,适用于中间件、监控、事务等场景,保持职责单一与类型一致。

在 Go 语言中,装饰者模式是一种灵活扩展结构体功能的方式,无需修改原始类型代码。它通过组合和接口实现,在运行时动态添加行为,非常适合日志、权限校验、缓存等横切关注点的处理。
装饰者模式允许你将对象放入一系列包装器中,每层包装器都可以附加额外的行为或责任。与继承不同,装饰者更灵活,可以在不改变原类型的前提下增强功能。
Go 没有类和继承,但通过接口和结构体嵌套可以很好地实现这一模式。关键在于:
假设我们有一个用户服务接口,提供获取用户信息的方法:
type UserService interface {
GetUser(id int) string
}
type userService struct{}
func (s *userService) GetUser(id int) string {
// 模拟耗时操作
return fmt.Sprintf("User-%d", id)
}
现在需要为 GetUser 方法增加日志记录能力,而不修改原始逻辑。我们可以创建一个日志装饰器:
type loggingDecorator struct {
service UserService
}
func NewLoggingDecorator(s UserService) UserService {
return &loggingDecorator{service: s}
}
func (d *loggingDecorator) GetUser(id int) string {
fmt.Printf("Calling GetUser with ID: %d\n", id)
result := d.service.GetUser(id)
fmt.Printf("GetUser returned: %s\n", result)
return result
}
使用时只需将原始服务包装起来:
service := &userService{}
loggedService := NewLoggingDecorator(service)
loggedService.GetUser(42) // 自动输出日志
装饰者模式的强大之处在于可叠加多个装饰器。比如再加一个缓存装饰器:
type cacheDecorator struct {
service UserService
cache map[int]string
}
func NewCacheDecorator(s UserService) UserService {
return &cacheDecorator{
service: s,
cache: make(map[int]string),
}
}
func (c *cacheDecorator) GetUser(id int) string {
if name, ok := c.cache[id]; ok {
return name
}
name := c.service.GetUser(id)
c.cache[id] = name
return name
}
然后可以按顺序组合多个装饰器:
service := &userService{}
cached := NewCacheDecorator(service)
logged := NewLoggingDecorator(cached)
logged.GetUser(42) // 先走日志,再查缓存,最后调用真实服务
logged.GetUser(42) // 缓存生效,但仍会打印日志
执行顺序由包装顺序决定,外层装饰器先触发。
装饰者模式特别适合以下场景:
设计时注意保持每个装饰器职责单一,避免把所有功能塞进一个大装饰器里。同时确保装饰器和被装饰者都实现同一接口,保证类型一致性。
基本上就这些。Go 的接口和组合机制让装饰者模式实现简洁自然,是扩展功能时值得掌握的技巧。
上一篇:Web服务组件入门笔记整理
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9