主页

索引

模块索引

搜索页面

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("票已售空")
  }
}

代理模式的应用场景

  1. 业务系统的非功能性需求开发:

    代理模式最常用的一个应用场景就是,在业务系统中开发一些非功能性需求,比如:
      监控、统计、鉴权、限流、事务、幂等、日志。
    我们将这些附加功能与业务功能解耦,放到代理类中统一处理,让程序员只需要关注业务方面的开发。
    
  2. RPC 框架也可以看作一种代理模式:

    通过远程代理,将网络通信、数据编解码等细节隐藏起来。
    客户端在使用 RPC 服务的时候,就像使用本地函数一样,无需了解跟服务器交互的细节。
    
  3. 代理模式在缓存中的应用:

    两个接口,一个支持缓存,一个支持实时查询
      需要实时数据的需求,我们让其调用实时查询接口,
      不需要实时数据的需求,我们让其调用支持缓存的接口
    缓存接口就可以在「实时查询的接口」基础上使用「代理模式」
    

主页

索引

模块索引

搜索页面