代理模式

代理模式概念

代理模式(Proxy Pattern)是一种结构型设计模式,它允许你为某个对象提供一个代理或占位符,并控制对该对象的访问。代理模式的核心思想是通过一个代理对象来间接访问目标对象。

代理模式的作用

控制访问:代理可以控制对真实对象的访问权限。
延迟加载:在需要时才创建昂贵的对象实例,优化性能。
远程代理:为远程对象提供本地代表,隐藏网络通信细节。
日志记录:在访问真实对象之前或之后记录日志。
缓存:代理可以在内存中缓存结果,减少重复计算或数据获取的时间。
安全增强:通过代理实现额外的安全检查或验证。

代理模式的使用场景

虚拟代理:

延迟加载大对象或资源密集型对象。

示例:图片加载器,只有在需要显示时才加载图片。

远程代理:

为远程服务提供本地接口。

示例:RPC(远程过程调用)或REST API客户端。

保护代理:

控制对对象的访问权限。

示例:文件系统中对不同用户限制读写权限。

智能引用代理:

在访问对象时执行额外操作,如计数、日志记录等。

示例:统计某个方法被调用的次数。

缓存代理:

缓存结果以减少重复计算或数据库查询。

示例:缓存频繁查询的数据库结果。

GO 语言代理模式源码示例

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)

	// 总结 :
	// 缓存代理模式 :
	// 通过代理对象对缓存进行管理,从而达到缓存数据的复用,提高性能。
}