代理模式,顾名思义,就是我们在需要访问一个类时,并不直接调用这个类,而是通过一个"代理"来间接地实现这个过程。
这个“代理”就像是真实对象的一个接口,所有的对于真实对象的操作都需要通过这个“代理”来实现。“郑重其事的代理”,这或许是代理模式的最好解释。在计算机科学领域,代理模式是一种设计模式,它通过为其他对象提供一个类型为代理或占位符的替身,以控制对这个对象的访问。使用代理模式,可以在不改变接口的前提下实现对目标对象的控制访问。
举个最日常的例子,现实生活中代理的例子,比如我们去外国旅行,可能不会直接预定酒店和买机票,而是找一个旅行社作为我们的代理。这个旅行社就会代表我们去做这些事情。同样地,编程中的代理模式也遵循这个原理。
我将针对代理模式的四个关键应用场景:远程代理、虚拟代理、安全代理和智能指引,深入地探讨它们在实际中的应用,并使用代码(Go和Java)进行说明。
远程代理主要处理不在本地计算机的对象。代理对象扮演着远程对象的本地代表,所有对远程对象的操作都通过代理对象完成。
Go示例:
//使用Go的rpc库进行远程代理示例,这里仅作示例,并〔非真实运行代码。
type RemoteServer struct{}
func (r *RemoteServer) SayHello(arg *int, reply *string) error {
*reply = "Hello from remote server"
return nil
}
type Proxy struct {
client *rpc.Client
}
func (p *Proxy) SayHello() string {
var reply string
err := p.client.Call("RemoteServer.SayHello", new(int), &reply)
if err != nil {
log.Fatal("Error :", err)
}
return reply
}
func main() {
client, _ := rpc.DialHTTP("tcp", "127.0.0.1:1234")
proxy := &Proxy{client: client}
fmt.Println(proxy.SayHello()) //print: Hello from remote server
}
虚拟代理用于处理大规模资源的对象,比如大图像或者网络资源。在真正需要时,再去创建或加载这个资源。
安全代理用于控制真实对象的访问权限,只有通过安全检查的请求才能访问真实对象。比如,有些对象有对其访问和操作的权限限制,我们可以把权限的处理逻辑放到代理中。
Go示例:
//文件模块接口
type File interface {
Read(name string) string
}
//真实的文件模块
type RealFile struct{}
func (RealFile) Read(name string) string {
return "读取文件" + name
}
// ProxyFile作为一个代理,提供额外的安全检查
type ProxyFile struct {
file RealFile
}
func (p ProxyFile) Read(name string) string {
// 额外的安全检查
if len(name) > 10 {
return "文件名过长,不允许访问。"
}
return p.file.Read(name)
}
智能指引是为一个对象提供一种代理,并在一些特定的情况下选择提供一种“智能”的操作方式。比如引用计数,如果一个对象进行指向操作,其引用计数+1;如果进行解引用操作,其引用计数-1,等到引用计数为0时,可以自动回收对象。
如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的经验~