Proxy-代理模式 ################## .. note:: 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("票已售空") } } 代理模式的应用场景 ================== 1. 业务系统的非功能性需求开发:: 代理模式最常用的一个应用场景就是,在业务系统中开发一些非功能性需求,比如: 监控、统计、鉴权、限流、事务、幂等、日志。 我们将这些附加功能与业务功能解耦,放到代理类中统一处理,让程序员只需要关注业务方面的开发。 2. RPC 框架也可以看作一种代理模式:: 通过远程代理,将网络通信、数据编解码等细节隐藏起来。 客户端在使用 RPC 服务的时候,就像使用本地函数一样,无需了解跟服务器交互的细节。 3. 代理模式在缓存中的应用:: 两个接口,一个支持缓存,一个支持实时查询 需要实时数据的需求,我们让其调用实时查询接口, 不需要实时数据的需求,我们让其调用支持缓存的接口 缓存接口就可以在「实时查询的接口」基础上使用「代理模式」