代理模式(Proxy Pattern)是一种结构型设计模式,它允许你为某个对象提供一个代理或占位符,并控制对该对象的访问。代理模式的核心思想是通过一个代理对象来间接访问目标对象。
控制访问:代理可以控制对真实对象的访问权限。
延迟加载:在需要时才创建昂贵的对象实例,优化性能。
远程代理:为远程对象提供本地代表,隐藏网络通信细节。
日志记录:在访问真实对象之前或之后记录日志。
缓存:代理可以在内存中缓存结果,减少重复计算或数据获取的时间。
安全增强:通过代理实现额外的安全检查或验证。
延迟加载大对象或资源密集型对象。
示例:图片加载器,只有在需要显示时才加载图片。
为远程服务提供本地接口。
示例:RPC(远程过程调用)或REST API客户端。
控制对对象的访问权限。
示例:文件系统中对不同用户限制读写权限。
在访问对象时执行额外操作,如计数、日志记录等。
示例:统计某个方法被调用的次数。
缓存结果以减少重复计算或数据库查询。
示例:缓存频繁查询的数据库结果。
package main
import "log"
// 缓存接口
type Cache interface {
Get() (any, error)
}
// 缓存实现
type CacheImpl struct {
// 缓存数据
data any
}
func (c *CacheImpl) Get() (any, error) {
// 获取缓存数据
return c.data, nil
}
// 缓存代理
type CacheProxy struct {
// 缓存接口
cache Cache
}
func (cacheProxy *CacheProxy) Get() (any, error) {
if cacheProxy.cache == nil {
// 创建缓存实现
cacheProxy.cache = &CacheImpl{
data: "缓存数据",
}
log.Println("创建缓存实现 ...")
}
return cacheProxy.cache.Get()
}
func main() {
// 创建缓存代理
cacheProxy := &CacheProxy{}
// 第一次获取缓存数据
data, err := cacheProxy.Get()
if err != nil {
log.Println(err)
}
log.Println(data)
// 第二次获取缓存数据
data2, err2 := cacheProxy.Get()
if err2 != nil {
log.Println(err2)
}
log.Println(data2)
// 总结 :
// 缓存代理模式 :
// 通过代理对象对缓存进行管理,从而达到缓存数据的复用,提高性能。
}