2.7设计模式——Proxy 代理模式(结构型)

news2024/11/19 9:19:57

意图

为其它对象提供一种代理以控制这个对象的访问。

结构

  1. Proxy保存一个引用使得代理可以访问实体;提供一个与Subject的接口相同的接口,使代理可以用来替代实体;控制实体的存取,并可能负责创建和删除它;其他功能依赖于代理的类型;
    1. Remote Proxy负责对请求及其他参数进行编码,冰箱不同地址空间中的实体发送已编码的请求;
    2. Virtual Proxy可以缓存实体的附加信息,以便延迟对它的访问;
    3. Protection Proxy检查调用者是否具有实现一个请求所必须的访问权限;
  2. Subject定义RealSubject和Proxy的公用接口,这样就可以在任何使用RealSubject的地方都可以使用Proxy。
  3. RealSubject定义Proxy所代表的实体。

适用性

Proxy模式适用于在需要比较通用和复杂的对象指针替代简单指针的时候,常见的情况有:

  • 远程代理(Remote Proxy):为一个对象在不同地址空间提供局部代表。
  • 虚拟代理(Virtual Proxy):根据需要创建开销很大的对象。
  • 保护代理(Protecion Proxy):控制对原始对象的访问,用于对象应该有不同的访问权限的时候。
  • 智能引用(Smart Reference):取代了简单额指针,它在访问对象时执行一些附加操作,典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以被自动释放;当第一次引用一个持久对象时,将它装入内存;在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。

代码示例

使用虚拟代理模式来设计图像查看器程序。将创建一个虚拟代理类 ImageProxy 和一个真实类 RealImageImageProxy 类将延迟加载 RealImage 对象。

// 虚拟代理类
public class ImageProxy implements Image {
    private String filename;
    private RealImage realImage;

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

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

// 真实类
public class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        // 加载图像数据
        System.out.println("加载图像:" + filename);
    }

    @Override
    public void display() {
        // 显示图像
        System.out.println("显示图像:" + filename);
    }
}

// 测试代码
public class Main {
    public static void main(String[] args) {
        Image image1 = new ImageProxy("image1.jpg");
        Image image2 = new ImageProxy("image2.jpg");

        image1.display(); // 加载图像1
        image2.display(); // 加载图像2
        image1.display(); // 不再加载图像1
    }
}

代码设计注释

  • ImageProxy 类是一个虚拟代理类,它实现了 Image 接口。
  • ImageProxy 类有一个构造函数,它接受图像文件名作为参数。
  • ImageProxy 类有一个 display() 方法,它负责显示图像。如果 realImage 对象为空,则创建一个新的 RealImage 对象并加载图像数据。否则,直接调用 realImage.display() 方法。
  • RealImage 类是一个真实类,它也实现了 Image 接口。
  • RealImage 类有一个构造函数,它接受图像文件名作为参数。
  • RealImage 类有一个 display() 方法,它负责显示图像。
  • 在 Main 类中,创建了两个 ImageProxy 对象,并调用了它们的 display() 方法。第一次调用 image1.display() 时,会加载图像1。第一次调用 image2.display() 时,会加载图像2。第二次调用 image1.display() 时,不会再加载图像1,因为 realImage 对象已经存在

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1624661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【【gitlab解决git Clone 出现 Permission denied, please try again.】】

【gitlab解决git Clone 出现 Permission denied, please try again.】 问题解决随便找一个地方 点击右键输入ssh -keygen -C "邮件"显示结果输入 登录gitlab然后再次git Clone就可以了。 问题 git clone的时候出现 Permission denied, please try again 解决 随便…

ChatGPT付费创作系统V2.8.4独立版 WEB+H5+小程序端 (新增Pika视频+短信宝+DALL-E-3+Midjourney接口)

小狐狸GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序,是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT,流量超级大,引流不要太简单!一键下单即可拥有自己的GPT!无限多…

【draw.io的使用心得介绍】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

K8S--常用的命令

原文网址:K8S--常用的命令-CSDN博客 简介 本文介绍K8S常用的命令。 官网 简略用法:https://kubernetes.io/zh-cn/docs/reference/kubectl/ 详细用法(有示例):https://kubernetes.io/docs/reference/generated/kub…

JS设计模式-透过现象看本质

JS设计模式-透过现象看本质 设计模式SOLID设计原则创建型构造器模式工厂模式 - 简单工厂工厂模式 - 抽象工厂(开发封闭原则)构造器和简单、抽象工厂的区别 单例模式原型模式 结构型装饰器模式适配器模式代理模式事件代理 - 事件冒泡虚拟代理 - 通过Image…

前端开发攻略---用原生JS在网页中也能实现语音识别

1、语音识别的过程 语音识别涉及三个过程:首先,需要设备的麦克风接收这段语音;其次,语音识别服务器会根据一系列语法 (基本上,语法是你希望在具体的应用中能够识别出来的词汇) 来检查这段语音;最后&#xf…

【Qt 学习笔记】Qt常用控件 | 输入类控件 | Text Edit的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 输入类控件 | Text Edit的使用及说明 文章编号&#xff…

Jsoncpp搭建交叉编译环境(移植到arm)

1. 官网下载源码 github地址:GitHub - open-source-parsers/jsoncpp at update 2. 交叉编译环境 当前平台/开发平台-编译环境: [rootlocalroot ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalroot ~]# uname -a Lin…

大型语言模型LLM的数据管理与应用

大型语言模型(LLM)风靡全球,尤其是 OpenAI 的最新发展。LLMs 的魅力来自于其理解、解释和生成人类语言的能力,而这曾被认为是人类的专属领域。像 CoPilot 这样的工具正在迅速融入开发人员的日常生活,而以 ChatGPT 为动…

使用 Redux 管理全局状态

Redux 是个状态集中管理框架,状态可以跨组件共享,状态更新后,调用监听器。其实状态可以认为就是个全局对象,为什么要做一个框架来管理呢?如果我们自己使用一个全解字典来管理状态是不是也行?如果不做任何控…

不同语言在算法使用方面的差异(Java 、C++篇)

由于我认为的会了是能得到结果了,所以我亲自去把题解的C代码给改成了Java的,尽管代码和逻辑上的高度统一。编译器还是报错了。 第三个死都过不去。而且后面的还超时了。 这使我十分怀疑是不是超时或者空间不够所导致的。但是去问讯飞星火,它…

自有道 更从容——林肯携“四大美式客厅”登陆北京国际车展,以传世豪华 优雅从容为品牌注入全新内涵

【北京 2024年4月25日】传世豪华,优雅从容。今日,第十八届北京国际汽车展览会正式启幕。作为美式豪华品牌的引领者,林肯在此次北京车展为“豪华 自有其道”注入全新内涵,并以车展首创的四大美式客厅形式诠释不同的人生境界&#x…

AWS制作WordPress在国内外的利弊?

AWS作为全球领先的云计算服务供应商,为WordPress提供了强大且灵活的托管环境,使用AWS来搭建和运行WordPress无疑是个不错的选择。即便如此使用AWS制作还是会有些许利弊,九河云作为AWS的合作伙伴来为读者们仔细探讨AWS在WordPress的利弊。 利&…

diskMirror docker 使用容器部署 diskMirror 服务器!!!

Welcome to diskMirror-docker 获取项目 这个项目是 diskMirror-spring-boot 镜像版本的项目,您可以使用下面的命令将此项目编译为一个镜像! # 进入到您下载的源码包目录 cd diskMirror-docker# 点击脚本来进行版本的设置以及对应版本的下载 设置 和 编…

Linux 安装 nvm,并使用 Jenkins 打包前端

文章目录 nvm是什么nvm下载nvm安装设置 nvm 环境变量设置 Jenkins 打包命令 nvm是什么 nvm全英文也叫node.js version management,是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具,为了解决node.js各种版本存在不兼容现象可以通过它可以安装…

artifactory配置docker本地存储库

​一、概述 本地 Docker 存储库是我们部署和托管内部 Docker 镜像的位置。实际上,它是一个 Docker 注册表,能够托管的 Docker 镜像的集合。通过本地存储库,你可以保存、加载、共享和管理自己的 Docker 镜像,而无需依赖于外部的镜像…

简单的jmeter脚本自动化

1、创建线程组,定义自定义变量,保存请求默认值 2、用csv编写测试用例 3、使用csv文件读取测试用例 4、创建http请求 5、添加相应断言 6、运行结果

vue中使用echarts实现X轴动态时间(天)的折线图表

项目要求x轴以一天为间隔&#xff0c;时间是动态返回的数据&#xff0c;折线图平滑展示 实现代码如下&#xff1a; <div class"echarts-main"><v-chart ref"echarts" :options"options" /> </div>// 局部引入vue-echarts im…

ios CI/CD 持续集成 组件化专题一 iOS 将图片打包成bundle

一、 创建 选择 macos 下的Bundle 二 、取名点击下一步 三、Base SDK 选择ios 四 、Build Active Architecture Only 五、Installation后面的内容删除 六、Skip Install 选择NO 七、Strip Debug Symbols During Copy 中"Release"项设置为 "YES" 八、COM…

ansible-copy用法

目录 概述实践 概述 ansible copy 常用用法举例 实践 # with_fileglob 是 Ansible 中的一个循环关键字&#xff0c;用于处理文件通配符匹配的结果 # 遍历 addons/files/*.txt文件 # dest: /data/soft/test 目录要事先存在,才能正常的copy - name: Copy configuration filescop…