代理模式通过代理结构体控制对真实对象的访问,可在不修改原始接口的情况下增加权限校验、延迟加载、日志记录等功能。其核心由三部分组成:统一接口、真实对象和代理。代理持有真实对象引用,并在调用前后加入控制逻辑,如权限判断。示例中,非管理员角色访问资源时被拒绝,管理员则可正常访问。常见应用场景包括权限控制、延迟初始化、日志监控和缓存代理。关键在于代理与真实对象实现同一接口,保证调用透明性,便于扩展与维护。Go语言通过接口与组合机制可简洁实现该模式。

在Go语言中,代理模式常用于控制对某个对象的访问,可以在不改变原始接口的前提下,增加权限校验、延迟加载、日志记录、缓存等功能。代理模式的核心是通过一个代理结构体来间接访问真实对象,从而实现访问控制。
代理模式的基本结构
代理模式通常包含三个部分:
- 接口(Interface):定义真实对象和代理共同遵守的行为契约。
- 真实对象(Real Subject):实现具体业务逻辑。
- 代理(Proxy):持有真实对象的引用,在调用前后加入控制逻辑。
以下是一个简单的示例,展示如何使用代理控制对资源的访问。
代码示例:访问控制代理
// 定义资源访问接口type Resource interface {
Access() string
}
// 真实资源
type RealResource struct{}
func (r *RealResource) Access() string {
return "真实资源被访问"
}
// 代理
type ProxyResource struct {
real *RealResource
userRole string
}
func (p *ProxyResource) Access() string {
if p.userRole != "admin" {
return "拒绝访问:权限不足"
}
if p.real == nil {
p.real = &RealResource{}
}
return p.real.Access()
}
func main() {
proxy := &ProxyResource{userRole: "guest"}
fmt.Println(proxy.Access()) // 输出:拒绝访问:权限不足
proxyAdmin := &ProxyResource{userRole: "admin"}
fmt.Println(proxyAdmin.Access()) // 输出:真实资源被访问
}
常见应用场景
代理模式在实际开发中有多种用途:
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
立即学习“go语言免费学习笔记(深入)”;
- 权限控制:如上面例子,在访问前检查用户角色。
- 延迟初始化:仅在真正需要时才创建真实对象,节省资源。
- 日志与监控:在方法调用前后记录日志或统计耗时。
- 缓存代理:对频繁请求的结果进行缓存,减少重复计算。
接口一致性的重要性
代理必须实现与真实对象相同的接口,这样调用方无需关心自己使用的是代理还是真实对象。这种透明性是代理模式的关键优势。只要类型满足接口,就可以自由替换,便于测试和扩展。
基本上就这些,代理模式在Go中通过接口和组合很容易实现,适合用来优雅地增强对象行为而不侵入原有逻辑。









