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

这篇具有很好参考价值的文章主要介绍了【设计模式】代理模式例子解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

【设计模式】代理模式例子解析,设计模式,代理模式,系统安全,面试,前端,安全

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

代理模式的应用

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

代码实现

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

1. 远程代理

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

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示例:

//文件模块接口
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时,可以自动回收对象。

代理模式的优缺点

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

如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的经验~文章来源地址https://www.toymoban.com/news/detail-824310.html

到了这里,关于【设计模式】代理模式例子解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式】六、【创建性模式】揭秘单例模式:从生活例子到Java代码

    转自:提升工作效率-单例模式详解 1、介绍 单例模式的产生,它主要是为了解决在软件系统中,对于一些类,我们只需要创建一个全局唯一的实例。例如,系统的配置信息、数据库连接池等。如果有多个实例可能会导致状态不一致,或者额外的资源消耗。这个需求在很多软件

    2024年02月06日
    浏览(32)
  • 二十三种设计模式全面解析-装饰器模式的高级应用:打造灵活可扩展的通知系统

    在现代软件开发中,通知系统是一个广泛应用的功能,用于实时向用户发送各种类型的通知,如短信、微信、邮件以及系统通知。然而,通知系统的需求通常是多变且动态的,因此需要一种灵活可扩展的设计模式来满足不同类型的通知需求。 在前面一篇文章中,我们介绍了什

    2024年02月06日
    浏览(37)
  • 设计模式之代理模式(静态代理&动态代理)

    目录 1、什么是代理模式 2、代理模式的结构 3、代理模式的实现 3.1 静态代理和动态代理概念 3.2 静态代理 3.3 动态搭理 3.3.1 代码实现 3.3.2 Proxy类讲解 4、动态代理VS静态代理 5、代理模式优缺点 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象

    2024年02月03日
    浏览(24)
  • 设计模式8:代理模式-动态代理

    上一篇:设计模式8:代理模式-静态代理 “动态”的含义是 代码生成代理类,一个代理类可以代理多个接口 。 动态区别于 死板 ,静态代理中一个代理类只能代理一个接口,其他不同的接口,就需要再手写不同的代理类,这就很 死板 。 动态代理类似于在安卓里面,我们常

    2024年02月09日
    浏览(23)
  • 设计模式8:代理模式-静态代理

    我尝试在JDK、Android SDK和一些出名的库中,寻找静态代理的源码,没能找到。如果有读者发现,欢迎评论或者私信我。 1. 售票代理 售票服务 站点售票 代理网点售票 2. 明星代理

    2024年02月11日
    浏览(25)
  • Java设计模式 (三) 代理设计模式

    什么是代理设计模式? 代理设计模式是一种结构型设计模式,它允许创建一个代理对象,用于控制对其他对象的访问。代理模式通常用于在访问对象时添加一些附加操作,而不是直接访问真实对象。代理模式可以在不改变原始类代码的情况下,通过引入代理类来增强功能。 代

    2024年02月12日
    浏览(35)
  • 设计模式-代理模式

    ● 为对象提供一个代理类,增强该对象的方法,控制对这个对象的访问 ● 静态代理和动态代理:静态代理就是编译的时候就已经确定,而动态代理就是运行时才会生成 缓存代理 ● 提供数据的缓存功能,避免数据库重复查询 实践 定义数据查询的接口 接口实现类实现接口

    2024年02月11日
    浏览(30)
  • 设计模式 -- 代理模式

    月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸-吸收各种知识-不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同样希望大家

    2023年04月08日
    浏览(31)
  • 【设计模式】代理模式

    5.1.1 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成

    2024年02月15日
    浏览(39)
  • 设计模式之代理模式

    当我们有对象因为安全性,不能直接对外暴露,或者是需要对对象的操作本身记录日志等信息时就可以考虑使用代理模式, 享元设计模式,包含如下元素: UML图如下: 另外,代理又分为静态代理和动态代理,静态代理就是在编译器已经确定的代理方式,即是硬编码到程序中

    2024年02月16日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包