代理模式通过代理结构体控制对真实服务的访问,示例中定义Service接口及其实现RealService,ProxyService在DoWork前检查role权限,仅admin可执行操作,guest则被拒绝,从而实现权限校验逻辑与业务分离。

在 Go 语言中,代理模式(Proxy Pattern)常用于控制对真实对象的访问,特别适合实现权限校验、日志记录、缓存等横切逻辑。下面通过一个简单的权限控制示例,展示如何使用代理模式来限制对某个服务方法的调用。
我们先定义一个通用的服务接口,表示需要被代理的目标对象:
type Service interface {
DoWork() string
}
这个接口只有一个方法 DoWork,代表某个受保护的操作。
这是实际处理业务逻辑的结构体:
立即学习“go语言免费学习笔记(深入)”;
type RealService struct{}
func (r *RealService) DoWork() string {
return "工作已完成"
}
RealService 实现了 Service 接口,执行真正的业务操作。
代理结构体持有真实服务的引用,并在调用前进行权限判断:
type ProxyService struct {
realService *RealService
role string // 用户角色,如 "admin" 或 "guest"
}
func (p *ProxyService) DoWork() string {
if p.role != "admin" {
return "拒绝访问:权限不足"
}
return p.realService.DoWork()
}
代理在调用 DoWork 前检查用户角色,只有 admin 才能执行真实操作。
下面是完整调用过程:
func main() {
real := &RealService{}
// 模拟管理员访问
proxyAdmin := &ProxyService{realService: real, role: "admin"}
fmt.Println(proxyAdmin.DoWork()) // 输出:工作已完成
// 模拟普通用户访问
proxyGuest := &ProxyService{realService: real, role: "guest"}
fmt.Println(proxyGuest.DoWork()) // 输出:拒绝访问:权限不足
}
通过改变代理中的 role 字段,可以动态控制访问权限,而无需修改真实服务逻辑。
这种结构使得权限控制与业务逻辑解耦,便于扩展和维护。你也可以在此基础上增加日志、计数、延迟加载等功能。
基本上就这些,代理模式在权限场景下非常实用,代码清晰且易于测试。
以上就是Golang Proxy代理模式权限控制示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号