首页 > 其他分享 >设计模式之-代理模式

设计模式之-代理模式

时间:2024-06-22 22:54:37浏览次数:14  
标签:对象 代理 模式 filename 访问 RealImage 设计模式 display

代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对其他对象的访问。

代理模式主要解决的问题是在某些情况下,直接访问一个对象可能会带来一些问题,比如对象的创建和销毁需要额外的开销,或者需要对对象的访问进行控制和限制。

需要使用代理模式的时候,通常有以下情况:

  1. 对象的创建和销毁代价很高,可以通过使用代理延迟对象的创建,只有在真正需要时才进行创建。
  2. 对象的访问需要进行控制和限制,可以使用代理来控制对对象的访问权限,以及在访问对象前后执行一些额外的操作。

让我们用一个生活中的例子来类比代理模式。假设你是一名公司的员工,你的老板委托你去参加一个重要的商务会议。你作为代理人代表公司与其他人进行交流和谈判。在这个例子中,你是一个代理,你控制着你的老板(真实对象)与其他人的交互。你可以过滤信息、加入额外的谈判条件,或者在谈判前后执行其他操作,以确保谈判的顺利进行。

代理模式的优点包括:

  1. 控制对对象的访问:代理对象可以在访问真实对象之前或之后执行额外的操作,例如权限验证、日志记录等。
  2. 隐藏真实对象的实现细节:代理对象可以隐藏真实对象的实现细节,对客户端来说,只需要与代理对象进行交互即可。

代理模式也有一些缺点:

  1. 增加了系统的复杂性:引入代理对象可能会增加代码的复杂性,特别是当涉及多个代理层级时。
  2. 增加了资源消耗:代理对象的存在会增加系统的资源消耗,例如内存占用和处理时间。

适合使用代理模式的场景包括:

  1. 远程代理:当对象位于远程服务器上时,可以使用代理对象在本地进行访问,以减少网络延迟和带宽消耗。
  2. 虚拟代理:当对象的创建和销毁代价很高时,可以使用代理对象延迟对象的创建,只有在需要时才进行创建。
  3. 安全代理:当需要控制对对象的访问权限时,可以使用代理对象进行权限验证和限制。

下面是一个简单的代码示例,展示了代理模式的使用:

// 接口定义了真实对象和代理对象的共同行为
interface Image {
    void display();
}

// 真实对象
class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk(); // 模拟从磁盘加载图片的操作
    }

    private void loadFromDisk() {
        System.out.println("Loading image: " + filename);
    }

    public void display() {
        System.out.println("Displaying image: " + filename);
    }
}

// 代理对象
class ImageProxy implements Image {
    private String filename;
    private RealImage realImage;

    public ImageProxy(String filename) {
        this.filename = filename;
    }

    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Image image = new ImageProxy("image.jpg");

        // 图片对象并不会立即加载,直到调用display方法时才加载并显示
        image.display();
    }
}

在上面的示例中,我们有一个Image接口,定义了真实对象和代理对象的共同行为。

RealImage是真实对象的实现类,负责加载和显示图片。

ImageProxy是代理对象,它在调用display方法时延迟创建RealImage对象,并在需要时调用RealImage的display方法来显示图片。

通过使用代理模式,我们可以延迟图片的加载和显示,只有在调用display方法时才会真正加载图片。

这样可以节省系统资源,并提高了程序的响应速度。

标签:对象,代理,模式,filename,访问,RealImage,设计模式,display
From: https://www.cnblogs.com/guov/p/18262835

相关文章

  • 设计模式六大原则(一)---单一职责原则
    单一职责原则(SingleResponsibilityPrinciple,SRP)是面向对象设计中的一个原则,它要求一个类或模块应该有且只有一个引起它变化的原因。单一职责原则主要解决的问题是类的职责过于复杂,即一个类承担了过多的责任。当一个类具有多个职责时,任何一个职责的变化都可能影响到其他职责,导致......
  • java设计模式--装饰器模式
    装饰器模式是一种结构型设计模式,它允许你动态地向对象添加额外的行为。装饰器模式通过将对象包装在一个装饰器类中,以提供额外的功能,而不是修改原始对象的结构。装饰器模式主要解决的问题是在不改变现有对象结构的情况下,动态地添加功能或修改行为。它可以避免使用子类继承的方式引......
  • 红队内网攻防渗透:内网渗透之内网对抗:隧道技术篇&防火墙组策略&FRP&NPS&Chisel&Socks代
    红队内网攻防渗透1.内网隧道技术1.1Frp内网穿透C2上线1.1.1双网内网穿透C2上线1.1.1.1服务端配置1.1.1.2客户端配置1.1.2内网穿透信息收集1.1.2.1、建立Socks节点(入站没限制采用)1.1.2.2主动转发数据(出站没限制采用)1.2Nps内网穿透工具1......
  • C++设计模式 之 Monostate模式
    目录标题第一章:Monostate模式简介什么是Monostate模式?Monostate模式的工作原理使用Monostate模式的优势适用场景第二章:实现Monostate模式基本结构构造函数和析构函数使用案例总结第三章:Monostate模式的优缺点优点缺点Monostate模式与单例模式的比较第四章:Monostate模......
  • 尚玩助手app对接广告模式开发源码搭建
    当涉及到“尚玩助手”这样的App对接广告模式并进行源码搭建时,你需要遵循一系列步骤来确保广告的有效集成和App的稳定运行。以下是一个基本的流程指南:1.明确需求和广告模式需求分析:明确App需要对接的广告类型(如横幅广告、插屏广告、视频广告等)和广告展示策略。广告模式选择:根......
  • java单例设计模式 , 多例设计模式 , 工厂设计模式概念及详细介绍
    单例设计模式正常情况下一个类可以创建多个对象publicstaticvoidmain(String[]args){ //正常情况下一个类可以创建多个对象 Personp1=newPerson(); Personp2=newPerson(); Personp3=newPerson();}如果说有时一个对象就能搞定的事情,非要创建多......
  • 《植物大战僵尸杂交版》入驻原作创意模式(附下载)
    经典塔防游戏《植物大战僵尸》自2009年5月5日发布以来,以其独特的游戏设计和趣味性深受玩家喜爱。如今,这款经典游戏再次焕发新生,迎来了一个全新版本——《植物大战僵尸杂交版》。这一版本由B站UP主“潜艇伟伟迷”精心打造,以其创新的“杂交”玩法,为玩家带来了全新的游戏体验。《......
  • GPIO的工作模式
    输入模式:输入浮空、输入上拉、输入下拉、模拟输入输出模式:开漏输出、开漏复用功能、推挽式输出、推挽式输出复用功能输入浮空:输入上拉:输入下拉:开漏输出:开漏复用功能:推挽式输出:推挽式输出复用功能:......
  • Jemter代理服务器录制脚本,优化后形成性能测试场景
    在进行性能测试(压力、负载)等,先要有对应的测试场景,比如添加功能:要先登录成功,然后调用添加接口,输入添加的内容,才可以添加成功。那么可以通过Jemter代理服务器,设置代理,打开测试的网站,录制脚本,当然,也可以根据接口文档,使用接口文档添加对应的接口形成业务测试脚本。HTPP代理服务器设置......
  • Silence 主题暗黑模式根据浏览器配置,以及切换页面闪白屏的问题处理
    最近使用Silencev3.0.0-rc2主题遇到两个偏好问题(感谢作者提供了这么好用的主题),记录下处理的过程。暗黑/亮色模式跟随浏览器的主题切换由于主题当前支持的配置项auto是根据时间定的,而不是根据浏览器的配置来的,而我个人偏向于跟随浏览器的配置来自动设置,于是用js先判断浏......