代理模式通过代理对象控制对真实对象的访问,适用于权限校验、延迟初始化等场景。1. 定义Service接口,RealService实现具体逻辑,ProxyService持有RealService引用并在Request中检查userRole权限,非admin则拒绝访问;2. 示例中NewProxyService创建不同角色代理,admin可访问并触发日志记录,guest直接被拒绝;3. 常见应用包括权限验证、延迟加载、日志监控、缓存及远程代理,提升系统灵活性与安全性。

在Go语言中,代理模式是一种结构型设计模式,它通过引入一个代理对象来控制对真实对象的访问。这种模式常用于延迟初始化、权限校验、日志记录或网络请求代理等场景。下面介绍如何使用代理模式实现访问控制。
代理模式通常包含三个核心部分:
例如,我们想控制对某个服务的访问,可以先定义一个通用接口:
type Service interface {
Request() string
}真实的服务实现:
立即学习“go语言免费学习笔记(深入)”;
type RealService struct{}
func (r *RealService) Request() string {
return "RealService: 处理请求"
}代理服务,在访问前进行权限检查:
type ProxyService struct {
realService *RealService
userRole string
}
func (p *ProxyService) Request() string {
if p.userRole != "admin" {
return "拒绝访问:权限不足"
}
// 延迟初始化真实对象
if p.realService == nil {
p.realService = &RealService{}
}
return p.realService.Request()
}下面是一个完整示例,展示如何通过代理限制非管理员用户的访问:
package main
import "fmt"
// Service 接口统一访问方式
type Service interface {
Request() string
}
// RealService 真实业务逻辑
type RealService struct{}
func (r *RealService) Request() string {
return "RealService: 处理请求"
}
// ProxyService 代理,控制访问
type ProxyService struct {
realService *RealService
userRole string
}
func (p *ProxyService) Request() string {
if p.userRole != "admin" {
return "拒绝访问:权限不足"
}
if p.realService == nil {
p.realService = &RealService{}
}
fmt.Println("Proxy: 记录日志 - 用户开始请求")
result := p.realService.Request()
fmt.Println("Proxy: 记录日志 - 请求完成")
return result
}
// NewProxyService 工厂函数创建代理
func NewProxyService(role string) Service {
return &ProxyService{userRole: role}
}
func main() {
adminProxy := NewProxyService("admin")
guestProxy := NewProxyService("guest")
fmt.Println(adminProxy.Request())
// 输出:
// Proxy: 记录日志 - 用户开始请求
// RealService: 处理请求
// Proxy: 记录日志 - 请求完成
fmt.Println(guestProxy.Request())
// 输出:
// 拒绝访问:权限不足
}代理模式在Go中可用于多种访问控制场景:
代理模式让访问控制变得灵活,无需修改真实对象代码即可增强行为。
基本上就这些。
以上就是Golang如何使用代理模式控制访问的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号