代理模式通过代理结构体控制对真实对象的访问,可在不修改原始接口的情况下增加权限校验、延迟加载、日志记录等功能。其核心由三部分组成:统一接口、真实对象和代理。代理持有真实对象引用,并在调用前后加入控制逻辑,如权限判断。示例中,非管理员角色访问资源时被拒绝,管理员则可正常访问。常见应用场景包括权限控制、延迟初始化、日志监控和缓存代理。关键在于代理与真实对象实现同一接口,保证调用透明性,便于扩展与维护。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()) // 输出:真实资源被访问}常见应用场景代理模式在实际开发中有多种用途:go语言参考手册 中文CHM版Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译下载立即学习“go语言免费学习笔记(深入)
”;
权限控制:如上面例子,在访问前检查用户角色。
延迟初始化:仅在真正需要时才创建真实对象,节省资源。
日志与监控:在方法调用前后记录日志或统计耗时。
缓存代理:对频繁请求的结果进行缓存,减少重复计算。
接口一致性的重要性代理必须实现与真实对象相同的接口,这样调用方无需关心自己使用的是代理还是真实对象。这种透明性是代理模式的关键优势。只要类型满足接口,就可以自由替换,便于测试和扩展。
基本上就这些,代理模式在Go中通过接口和组合很容易实现,适合用来优雅地增强对象行为而不侵入原有逻辑。
