代理模式(Proxy Design Pattern)是一种结构型设计模式。意图为主对象提供额外的一层(代理)以控制对这个对象的访问。
也是一种 Wrapper 设计模式,与修饰器模式代码结构相似,但是意图不同。
Question:
type server interface {
handleRequest(string, string) (int, string)
}
应用服务器 AppServer 满足 server 接口。
如何为 AppServer 设计一个代理,对 handleRequest 接口进行流量控制?
Code:
|
|
Output:
Url: /app/status
HttpCode: 200
Body: Ok
Url: /app/status
HttpCode: 200
Body: Ok
Url: /app/status
HttpCode: 403
Body: Not Allowed
Url: /create/user
HttpCode: 201
Body: User Created
Url: /create/user
HttpCode: 404
Body: Not Ok
远程代理(Remote Proxy) 本地的调用者持有的接口实际上是一个代理,这个代理负责把对接口的方法访问转换成远程调用,然后返回结果。例如:GRPC
虚代理(Virtual Proxy) 它让调用者先持有一个代理对象,但真正的对象尚未创建。如果没有必要,这个真正的对象是不会被创建的,直到客户端需要真的必须调用时,才创建真正的对象。JDBC的连接池返回的JDBC连接(Connection对象)就可以是一个虚代理,即获取连接时根本没有任何实际的数据库连接,直到第一次执行JDBC查询或更新操作时,才真正创建实际的JDBC连接。
保护代理(Protection Proxy) 它用代理对象控制对原始对象的访问。例如鉴权、限流、监控、统计。
智能引用(Smart Reference) 它也是一种代理对象,如果有很多客户端对它进行访问,通过内部的计数器可以在外部调用者都不使用后自动释放它。