23种设计模式之代理模式(Proxy Pattern)

news2024/10/5 12:56:51

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的代理模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始
在这里插入图片描述

文章目录

  • 代理模式概念
  • 代理模式角色
  • 代理模式应用场景
  • 代理模式代码案例
  • 代理模式小结
  • 图书推荐

代理模式概念

代理模式是一种常用的结构性设计模式,它可以在不改变原始对象的情况下,为对象提供一个代替者或占位符,以控制对原始对象的访问。

代理模式分为两种类型:静态代理和动态代理。静态代理是指代理类在编译时已经确定并实现,而动态代理是指代理类在运行时动态生成的

代理模式角色

在代理模式中,有三个角色:

  • 抽象角色:定义了真实对象和代理对象的公共接口,这样在任何使用真实对象的地方都可以使用代理对象。

  • 真实角色:代表了真实对象,是我们要使用的对象。

  • 代理角色:代表了代理对象,它包含了一个指向真实对象的引用,从而可以操作真实对象。

代理模式应用场景

代理模式有多种应用场景,其中最常见的是远程代理、虚拟代理和保护代理。

远程代理:可以隐藏一个对象存在于不同地址空间的事实,使得客户端可以像调用本地对象一样调用远程对象。

虚拟代理:可以延迟对象的创建,只有到真正需要使用对象的时候才会创建,这样可以节省系统资源,提高程序的运行效率。

保护代理:控制对真实对象的访问,可以在真实对象被访问前进行权限检查和过滤等操作。

总的来说,代理模式可以提高系统的安全性、稳定性和灵活性,适用于各种复杂场景下的开发需求。

代理模式代码案例

以下是一个使用Java实现代理模式的例子:

首先,我们定义一个接口 Image,表示一个图片对象,其中 display() 方法用于显示图片。

public interface Image {
    void display();
}

然后,我们实现一个具体的图片对象类 RealImage,其中 display() 方法用于加载并显示图片。

public class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk();
    }

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

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

接下来,我们创建一个代理对象类 ProxyImage,它持有一个 RealImage 对象,并在需要的时候才创建和加载该对象。

public class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;

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

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

最后,我们可以通过以下方式来测试代理模式的实现:

public class ProxyPatternTest {
    public static void main(String[] args) {
        Image image = new ProxyImage("test.jpg");
        image.display();
        System.out.println();

        // 第二次访问时,图片已经被加载过了,不再需要重新创建
        image.display();
    }
}

运行上述代码,输出如下:

Loading test.jpg
Displaying test.jpg

Displaying test.jpg

可以看到,在第一次访问时,代理对象创建了一个真实的图片对象,并调用其 display() 方法来加载并显示图片。在第二次访问时,代理对象直接调用真实的图片对象的 display() 方法,无需再去创建和加载图片。这样,代理模式就实现了对真实对象的访问控制和管理。

代理模式小结

代理模式是一种常见的结构性设计模式,它通过引入代理角色来控制对真实对象的访问,从而增强了系统的安全性、稳定性和灵活性。代理模式分为静态代理和动态代理两种类型,应用场景包括远程代理、虚拟代理和保护代理等

图书推荐

本期推荐书籍为《设计模式:可复用面向对象软件的基础(典藏版)》
业内知名的4人著作,本书是引导读者走出软件设计迷宫的指路明灯,凝聚了软件开发界几十年设计经验的结晶。

在这里插入图片描述
粉丝福利:评论区任意留言可参与活动抽奖(可评论最多五条,抽取三名欧皇)

京东自营购买链接:点击购买

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

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

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

相关文章

扩展磁盘大小

此虚拟机之前硬盘大小为40G,需扩展为500G 1.虚拟机设置中,扩展硬盘大小为500G 2.启动此虚拟机,查看当前磁盘大小 3.查看磁盘情况 可查看到当前磁盘大小总共537G,实际使用37G 4.对磁盘分区 刷新分区 查看磁盘情况,可查…

目标检测数据预处理——根据部件类别按照特定位置拼图,缩小学习空间

首先放效果图,更直观看到本片是要干嘛的: 如图,就是将大图划分为44宫格的,4个部件类的目标框按照固定位置拼图,其中head、body的大图为每个宫格一张图,hand、foot的小图为每个宫格22张图(因为h…

LInux相关操作命令

目录 1、Linux用户和用户组管理 用户管理命令 系统管理 top命令 ps命令 kill命令 关机命令 重启命令 为什么学习命令 Linux刚面世是并没有图形界面,所有操作都靠命令完成,如磁盘操作、文件存取、目录操作、进程管理、文件权限等工作中&#xff…

react-naive工作原理

react-naive工作原理是从react的工作原理衍生出来的 react的工作原理 在react中,virtual dom 就像一个中间层,介于开发者描述的视图与实际在页面上渲染的视图之间。为了在浏览器上渲染出可交互的用户界面,开发者必须操作浏览器的Dom&#x…

系统分析师经典易错题,解题思路三

UML2.0包括14种图:分别如下:类图(class diagram),类图描述了一组类、接口、协作和他们之间的关系。在OO系统的建模中,最常见的图就是类图。类图给出了系统的静态设计视图,活动图的类图给出了系统的静态进程视图。对象图(object diagram)对象图描述了一组对象及它们之间…

linux centos 安装JDK、tomcat、nginx教程记录

一、安装jdk 1、查看linux系统的jdk位数(64/32位) 查看本机位数命令: sudo uname --m 2、进入jdk下载官网 Java Downloads | Oracle 现在默认是最新的jdk20 以为我是之前的项目,使用的是jdk1.8_181版本,所以我需要…

零基础自学网络安全/web安全,看这一篇就够了

作为一个安全从业人员,我自知web安全的概念太过于宽泛,我本人了解的也并不够精深,还需要继续学习。 但看到这个问题之后又想说说自己的看法,所以今天随手写写关于web安全的内容,希望对初次遇到web安全问题的同学提供帮…

Cadence+SPB16.2入门教程(上)

第1章焊盘制作 1.1用Pad Designer制作焊盘 Allegro中制作焊盘的工作叫Pad Designer,所有SMD焊盘、通孔焊盘以及过孔都用该工具来制作。 打开程序->Cadence SPB 16.2->PCB Editer utilities->Pad Designer,弹出焊盘制作的界面,如图1.1所示。 在Units下拉框中选择…

【CloudCompare教程】005:点云滤波处理大全

本文讲述基于cloudcompare软件的点云滤波方法及案例,包括:高斯滤波、低通滤波、双边滤波、统计滤波、CSF地面滤波等等。 文章目录 一、高斯滤波二、低通滤波三、双侧滤波四、统计滤波五、CSF地面滤波滤波(Wave filtering)是将信号中特定波段频率滤除的操作,是抑制和防止干…

5月22号软件资讯更新合集.....

DHorse v1.1.1 发布,基于 k8s 的发布平台 综述 DHorse 是一个简单易用、以应用为中心的云原生 DevOps 系统,具有持续集成、持续部署、微服务治理等功能,无需安装依赖 Docker、Maven、Node 等环境即可发布 Java 和 Node 应用,主要…

Telnet远程登录设备管理

Telnet远程登录原理 为了方便通过命令管理设备,可以使用Telnet协议对设备进行管理。 Telnet协议与使用Console接口管理设备不同,无需专用线缆直连设备的Console接口,只要IP地址可达、能够和设备的TCP 23端口通信即可。 支持通过Telnet协议进行管理的设备被称为Telnet服务器…

你还不知道~~这个是什么意思吗,还以为是作者写错了

文章目录 前言一、来个例子二、按位非~三、小知识 前言 主要是来学习一下js中运算符的相关的知识 一、来个例子 ~~(Math.random() * 10)看起来像是要获取随机数的。 我们先把括号内的东西粘到控制台看看: 结果: (Math.random() * 10) //4.47062635057…

面试冲冲冲

目录 一、数据库MYSQL 1.1 Oracle与Mysql的区别 1.2 Mysql索引 1.3 Mysql事务 1.4 Mysql存储引擎 1.5 B树 1.6 锁 1.7 优化 一、数据库MYSQL 1.1 Oracle与Mysql的区别 Oracle与Mysql的区别_oracle和mysql区别_顾优秀的博客-CSDN博客 浅谈MySQL和Oracle的区别_oracle…

都说聚合配送好,它到底能解决哪些同城配送难题?

自外卖经济兴起以来,即时配送一直呈现爆炸式增长。与该领域相关的商家、平台、骑手、用户数量和订单数量,也在保持着快速增长。其服务类别已从外卖扩展到人们生活的各个方面,需求增量稳步增长。 市场配送渠道虽多 配送问题仍是大难题 到目…

淘宝618活动节奏指南

一年一度的618活动又要开始啦,今天跟大家分享的是618活动时间节点,以及活动预热,活动期间,以及活动结束之后咱们应该做哪些事情。 这个是今年618活动的一个时间节点,和往年一样,主要分为预售,开…

代码随想录算法训练营day48 | 198.打家劫舍,213.打家劫舍II,337.打家劫舍III

代码随想录算法训练营day48 | 198.打家劫舍,213.打家劫舍II,337.打家劫舍III 198.打家劫舍解法一:动态规划 213.打家劫舍II解法一:分别掐头和去尾,动态规划 337.打家劫舍III解法一:树的递归遍历动态规划 总…

基于IF的网站异常流量检测

基于IF的网站异常流量检测 小P:最近渠道好多异常数据啊,有没有什么好的办法可以识别这些异常啊 小H:箱线图、 3 σ 3\sigma 3σ 都可以啊 小P:那我需要把每个特征都算一遍吗?不是数值的怎么算啊? 小H&#…

【2023年4月美赛加赛】Y题:Understanding Used Sailboat Prices 三篇完整论文及代码

【2023年4月美赛加赛】Y题:Understanding Used Sailboat Prices 建25页完整论文及代码 1 题目 2023年MCM 问题Y:理解二手帆船价格 和许多奢侈品一样,帆船的价值也会随着年代和市场条件的变化而变化。所附的“2023_MCM_Problem_Y_Boats.xlsx”文件包括2…

【dfn序+DP】树

把一棵树转化成一个序列有三种方法: dfs序 dfn序(时间戳) 欧拉序 关于这三者的区别,参考这篇博客,讲的超级好! 重谈DFS序、时间戳和欧拉序 - Seaway-Fu - 博客园 (cnblogs.com) 题意: 思路…

【SpringBoot】七:Web服务---Servlet Filter Listener

文章目录 1.Servlet1.1 使用WebServlet创建Servlet1.2 使用编码方式创建Servlet 2.Filter2.1 使用WebFilter创建Filter2.2 使用编码方式创建Filter2.3 Filter排序2.4 使用框架中的 Filter 3. Listener 1.Servlet 1.1 使用WebServlet创建Servlet (1)编写servlet WebServlet(…