【设计模式】代理模式例子解析

代理模式,顾名思义,就是我们在需要访问一个类时,并不直接调用这个类,而是通过一个"代理"来间接地实现这个过程。

这个"代理"就像是真实对象的一个接口,所有的对于真实对象的操作都需要通过这个"代理"来实现。"郑重其事的代理",这或许是代理模式的最好解释。在计算机科学领域,代理模式是一种设计模式,它通过为其他对象提供一个类型为代理或占位符的替身,以控制对这个对象的访问。使用代理模式,可以在不改变接口的前提下实现对目标对象的控制访问。

举个最日常的例子,现实生活中代理的例子,比如我们去外国旅行,可能不会直接预定酒店和买机票,而是找一个旅行社作为我们的代理。这个旅行社就会代表我们去做这些事情。同样地,编程中的代理模式也遵循这个原理。

代理模式的应用

  1. 远程代理:这是一种常见的应用场景,当我们需要访问一个远程服务时,通常不能直接访问,而是需要通过网络、协议等进行转换,此时就可以使用远程代理。例如,我们可能会在本地创建一个代理对象,这个对象内部封装了所有的网络通信等细节,我们使用这个对象就像使用本地对象一样。
  2. 虚拟代理:该模式常用于控制访问一些资源消耗大的对象。比如你有一个大图像需要加载,当用户操作这个图像时,我们可能不会立即加载,而是先显示一个占位符(代理),只有当真正需要的时候才会进行加载。
  3. 安全代理:这种类型的代理用于控制真实对象的访问权限,只有通过安全检查的请求才能访问真实对象。比如,有些对象有对其访问和操作的权限限制,我们可以把权限的处理逻辑放到代理中。
  4. 智能指引:这是一种复杂的代理模式,它不仅仅控制对真实对象的访问,还可以全方位地控制和协调。例如C++的智能指针,它可以记录一个对象被引用的次数,当对象的引用次数降为0时,智能指针就会自动销毁这个对象。

代码实现

我将针对代理模式的四个关键应用场景:远程代理、虚拟代理、安全代理和智能指引,深入地探讨它们在实际中的应用,并使用代码(Go和Java)进行说明。

1. 远程代理

远程代理主要处理不在本地计算机的对象。代理对象扮演着远程对象的本地代表,所有对远程对象的操作都通过代理对象完成。

Go示例:

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
}

2. 虚拟代理

虚拟代理用于处理大规模资源的对象,比如大图像或者网络资源。在真正需要时,再去创建或加载这个资源。

3. 安全代理

安全代理用于控制真实对象的访问权限,只有通过安全检查的请求才能访问真实对象。比如,有些对象有对其访问和操作的权限限制,我们可以把权限的处理逻辑放到代理中。

Go示例:

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)
}

4. 智能指引

智能指引是为一个对象提供一种代理,并在一些特定的情况下选择提供一种"智能"的操作方式。比如引用计数,如果一个对象进行指向操作,其引用计数+1;如果进行解引用操作,其引用计数-1,等到引用计数为0时,可以自动回收对象。

代理模式的优缺点

  • 优点:首先,代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。其次,代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用。
  • 缺点:代理模式会导致请求处理速度变慢,同时增加了系统的复杂性。

如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的经验~

相关推荐
软件派12 小时前
生产动态数据智能风控:阈值判别、趋势预测、异常识别算法工程落地实战
前端·数据库·算法
考研保研资料分享15 小时前
2022双非保研华科热能工程:三校考核、传热题与报名复盘
面试
骑着蜗牛撵大象32721 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
花开盛夏^.^21 小时前
电脑打开多个浏览器Web窗口占用较大的运行内存的原因
前端·浏览器
weixin_3077791321 小时前
RAG 面试陷阱——混合检索并非无条件优越:一个条件反转实验
人工智能·python·面试·职场和发展
Sinokap21 小时前
OpenAI 披露 AI 安全实验:智能体如何突破隔离边界?
人工智能·安全
馒头不想说话1 天前
实体店老板的24小时AI运营员工,写、剪、发全自动,省下一整个团队工资
前端
是真的小外套1 天前
网络安全实战第14期:Week2周末闯关
网络·安全·web安全
nice_lcj5201 天前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
椒哥1 天前
一天被问几十次"允许",我统计了 517 次,然后写了个插件
前端·javascript·github