简介
代理模式(Proxy Pattern)是一种结构型设计模式,它充当其他对象的接口,以控制对这个对象的访问。代理模式主要用于在访问一个对象时引入一定程度的间接性,以便实现某些控制或附加功能。
在代理模式中,通常会涉及到以下几个角色:
Subject(主题接口)
定义了真实主题和代理类共同实现的接口。
RealSubject(真实主题)
定义了真正实现主题接口的类,是被代理的对象。
Proxy(代理类)
实现了主题接口,其中包含对真实主题的引用,以便在需要时代理真实主题。
你要买车,你又没忙,找了一个中间商代理,就是中介帮你去买车,你给他买车钱、代理费,他给你车。
Demo
// Subject 主题接口,要买车
type Subject interface {
buyCar(name string, price int)
}
// Boss 真实主题,老板要买车
type Boss struct {
}
func (b Boss) buyCar(name string, price int) {
fmt.Printf("委托中介买车,车品牌是%s,价格是%d,中介费是%d", name, price, price/2)
}
// Agent 代理商
type Agent struct {
boss Boss // 他代表老板
}
// 代理去买车
func (a *Agent) buyCar(name string, price int) {
a.boss.buyCar(name, price) // 买完车通知老板
}
这个例子中,subject是主题接口,定义了老板和代理商共同的事情,就是买车的接口,Boss是真实的主题,实现了买车的接口,表示真正处理请求的对象。Agent是代理商,也实现了buycar的接口,但是买完车后需要通知老板,所以包含对真实主题的引用。
作用和场景
控制对对象的访问
代理模式可以用于控制对某个对象的访问,例如在访问某个敏感对象或资源时进行授权、验证等。
附加功能
代理模式可以在不修改真实主题的情况下,为其附加一些额外的功能,例如记录日志、性能监测、缓存等。
延迟加载
代理模式可以实现延迟加载,即在真正需要使用真实主题时再进行实例化和初始化。
远程代理
代理模式可以在客户端和服务端之间引入代理,实现远程方法调用。
总体而言,代理模式适用于需要控制对对象访问、附加功能、延迟加载等场景。通过引入代理,可以在不改变原有代码的情况下,实现对对象访问的控制和附加功能的扩展。