Proxy-代理模式¶
备注
provides a placeholder for another object to control access, reduce cost, and reduce complexity.在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。
示例:
package proxy
import "fmt"
type Seller interface {
sell(name string)
}
// 火车站
type Station struct {
stock int //库存
}
func (station *Station) sell(name string) {
if station.stock > 0 {
station.stock--
fmt.Printf("代理点中:%s买了一张票,剩余:%d \n", name, station.stock)
} else {
fmt.Println("票已售空")
}
}
// 火车代理点
type StationProxy struct {
station *Station // 持有一个火车站对象
}
func (proxy *StationProxy) sell(name string) {
if proxy.station.stock > 0 {
proxy.station.stock--
fmt.Printf("代理点中:%s买了一张票,剩余:%d \n", name, proxy.station.stock)
} else {
fmt.Println("票已售空")
}
}
代理模式的应用场景¶
业务系统的非功能性需求开发:
代理模式最常用的一个应用场景就是,在业务系统中开发一些非功能性需求,比如: 监控、统计、鉴权、限流、事务、幂等、日志。 我们将这些附加功能与业务功能解耦,放到代理类中统一处理,让程序员只需要关注业务方面的开发。
RPC 框架也可以看作一种代理模式:
通过远程代理,将网络通信、数据编解码等细节隐藏起来。 客户端在使用 RPC 服务的时候,就像使用本地函数一样,无需了解跟服务器交互的细节。
代理模式在缓存中的应用:
两个接口,一个支持缓存,一个支持实时查询 需要实时数据的需求,我们让其调用实时查询接口, 不需要实时数据的需求,我们让其调用支持缓存的接口 缓存接口就可以在「实时查询的接口」基础上使用「代理模式」