小谈设计模式(8)—代理模式

news2024/11/25 12:22:37

小谈设计模式(8)—代理模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 代理模式
    • 代理模式角色分析
      • 抽象主题(Subject)
      • 真实主题(Real Subject)
      • 代理(Proxy)
    • 应用场景
      • 远程代理
      • 虚拟代理
      • 安全代理
      • 智能引用代理
      • 总结
    • Java程序实现
      • 首先,我们定义一个接口 Image,表示图像对象的接口:
      • 其次,我们创建一个真实的图像类 RealImage,实现 Image 接口,表示真实的图像对象:
      • 然后,我们创建一个代理类 ProxyImage,实现 Image 接口,表示图像的代理对象:
      • 最后,我们可以使用代理对象来访问真实的图像对象,例如:
      • 输出结果
      • 程序分析
    • 优缺点分析
      • 优点
      • 缺点
      • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

代理模式

代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对其它对象的访问。代理对象充当了被代理对象的接口,客户端通过代理对象来访问被代理对象,从而实现了对被代理对象的间接访问。

代理模式角色分析

抽象主题(Subject)

定义了代理对象和被代理对象的共同接口,客户端通过抽象主题来访问被代理对象。

真实主题(Real Subject)

实现了抽象主题接口,是被代理对象,代理对象将对其进行间接访问。

代理(Proxy)

实现了抽象主题接口,同时包含一个对真实主题的引用,客户端通过代理对象来访问真实主题。
在这里插入图片描述

应用场景

远程代理

代理模式常用于网络通信中,例如远程方法调用(RPC)。在分布式系统中,客户端可以通过代理对象来调用远程服务器上的方法,代理对象负责将调用请求发送到远程服务器并返回结果。远程代理隐藏了底层网络通信的细节,使得客户端可以像调用本地方法一样调用远程方法。

虚拟代理

虚拟代理用于在访问对象时进行一些额外的处理。一个常见的例子是延迟加载(Lazy Loading),当一个对象的创建或加载非常耗费资源时,可以使用虚拟代理来推迟对象的创建或加载,直到真正需要访问对象时才进行。例如,在图像加载时,可以使用虚拟代理来延迟加载图像数据,只有当需要显示图像时才真正加载图像数据。

安全代理

安全代理用于控制对对象的访问权限。例如,在一个权限管理系统中,可以使用安全代理来限制只有特定角色的用户才能访问某个对象。代理对象可以在访问真实对象前检查用户的角色,如果用户具有访问权限,则允许访问真实对象,否则拒绝访问。

在这里插入图片描述

智能引用代理

智能引用代理用于在访问对象时添加一些额外的功能。一个常见的例子是缓存功能,代理对象可以在访问真实对象前先检查缓存中是否存在对应的结果,如果存在则直接返回缓存结果,避免重复计算。另外,还可以使用智能引用代理来实现对象池,代理对象可以管理对象的创建和销毁,并在访问对象时从对象池中获取对象。

总结

代理模式在许多实际应用中都有广泛的应用。通过引入代理对象,可以实现对被代理对象的间接访问,并可以在访问前后做一些额外的处理,如网络通信、延迟加载、权限控制和功能扩展等。代理模式可以提高系统的灵活性和可扩展性,同时也需要权衡系统的复杂性和性能。
在这里插入图片描述

Java程序实现

首先,我们定义一个接口 Image,表示图像对象的接口:

public interface Image {
    void display();
}

其次,我们创建一个真实的图像类 RealImage,实现 Image 接口,表示真实的图像对象:

public class RealImage implements Image {
    private String filename;

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

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

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

然后,我们创建一个代理类 ProxyImage,实现 Image 接口,表示图像的代理对象:

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

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

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

最后,我们可以使用代理对象来访问真实的图像对象,例如:

public class Main {
    public static void main(String[] args) {
        Image image = new ProxyImage("test.jpg");

        // 第一次访问,会创建真实的图像对象并显示
        image.display();

        // 第二次访问,直接显示之前创建的真实图像对象
        image.display();
    }
}

输出结果

Loading image from disk: test.jpg
Displaying image: test.jpg
Displaying image: test.jpg

程序分析

在上面的示例中,ProxyImage 类充当了代理对象,它在访问真实的图像对象之前先进行了一些额外的处理。当第一次访问图像时,代理对象会创建真实的图像对象并显示;当第二次访问图像时,代理对象直接显示之前创建的真实图像对象,避免了重复加载和显示。通过代理对象,我们可以实现对真实对象的间接访问,并在访问前后做一些额外的处理。
在这里插入图片描述

优缺点分析

优点

代理模式可以实现对真实对象的间接访问,可以在访问前后做一些额外的处理,如权限控制、延迟加载、缓存等。
代理对象可以隐藏真实对象的具体实现细节,保护真实对象的安全性。
代理模式可以提高系统的灵活性和可扩展性,可以在不修改真实对象的情况下增加新的代理对象。
代理模式符合单一职责原则,可以将真实对象和代理对象分离,分别负责各自的功能。

缺点

由于引入了代理对象,会增加系统的复杂性,增加了代码的数量和维护的难度。
代理模式会引入额外的开销,因为需要通过代理对象来访问真实对象,可能会导致性能下降。
如果代理对象的创建和销毁过程比较复杂,可能会影响系统的性能。
在这里插入图片描述

总结

代理模式在许多实际应用中都有广泛的应用,可以提供额外的功能和保护真实对象的安全性。但是,在使用代理模式时需要权衡系统的复杂性和性能,确保代理对象的创建和销毁过程不会影响系统的性能。

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

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

相关文章

ubuntu22.04 x11窗口环境手势控制

ubuntu22.04 x11窗口环境手势控制 ubuntu x11窗口环境的手势控制并不优秀,我们可以使用touchegg去代替 这个配置过程非常简单,并且可以很容易在一定范围内达到你想到的效果,类比mac的手势控制 关于安装 首先添加源,并安装 sud…

数据结构-----二叉排序树

目录 前言 1.什么是二叉排序树 2.如何构建二叉排序树 3.二叉排序树的操作 3.1定义节点储存方式 3.2插入节点操作 3.2创建二叉排序树 3.4遍历输出(中序遍历) 3.5数据查找操作 3.6获取最大值和最小值 3.7删除节点操作 3.8销毁二叉排序树 4.完…

漏斗分析模型

从业务流程起点开始到最后日标完成的每个环节都会有用户流失,因此需要一种分析方法来衡量业务流程每一步的转化效率,漏斗分析方法就是这样的分析方法。 例如,在淘宝上一款商品的浏览量是 300、点击量是 100、订单量是 20、支付量是 10&#…

centos 部署nginx 并配置https

centos版本:centos 7.8 (最好不要用8,8的很多用法和7相差很大) 一.安装nginx 1。下载Nginx安装包:首先,访问Nginx的官方网站(https://nginx.org/)或您选择的镜像站点,找…

Linux知识点+命令

1. 简介 Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。 Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的…

BUUCTF reverse wp 81 - 85

[SCTF2019]babyre 反编译失败, 有花指令 有一个无用字节, 阻止反编译, patch成0x90 所有标红的地方nop掉之后按p重申函数main和loc_C22, F5成功 int __cdecl main(int argc, const char **argv, const char **envp) {char v4; // [rspFh] [rbp-151h]int v5; // [rsp10h] [rb…

谷歌扩展下载

Chrome 扩展下载安装网站推荐 # 1. 极简插件优质crx应用 ●地址:https://chrome.zzzmh.cn ●推荐:★★★★★ 一个非常良心 & 干净 & 简洁的 Chrome 扩展下载网站,体验非常不错! 侧边栏可以通过类型对扩展进行筛选和排序&…

亲测可用国产GPT人工智能

分享一些靠谱、可用、可以白嫖的GPT大模型。配合大模型,工作效率都会极大提升。 清华大学ChatGLM 官网: 智谱清言中国版对话语言模型,与GLM大模型进行对话。https://chatglm.cn/开源的、支持中英双语的1300亿参数的对话语言模型&#xff0…

1688商品详情 API(测试实例)

1688.item_get 测试实例 API测试页 点此进入 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_searc…

【箱子之字形摆放】python实现-附ChatGPT解析

1.题目 箱子之形摆放 知识点:数组 时间限制:1s 空间限制:128MB 限定语言:不限 题目描述: 有一批箱子(形式为宁符串,设为str) ,要求将这批箱子按从上到下 以 之形 的顺序摆放在宽度为n的空地,请输出箱子的摆放结果。 例如:箱子为ABCDEFG,空地宽度为3,摆放结果如图: 则输…

【C++11】右值引用和移动语义 {左值引用和右值引用;移动语义;解决函数传值返回的深拷贝问题;完美转发}

一、左值引用和右值引用 传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。 什么是左值?什么是左值引用&#xff1…

《数据结构、算法与应用C++语言描述》-栈的应用-开关盒布线问题

开关盒布线问题 问题描述 在开关盒布线问题中,给定一个矩形布线区域,其外围有若干管脚。两个管脚之间通过布设一条金属线路来连接。这条金属线路称为电线,它被限制在矩形区域内。两条电线交叉会发生电流短路。因此,电线不许交叉…

乐鑫 ESP-Mesh-Lite在windows下的开发环境搭建

ESP-Mesh-Lite的开发环境由于没有官方教程,折腾了好几天。环境搭建主要还是参考ESP-MDF环境搭建,特别注意的是必须要在CMD环境下操作,不能用POWER SHELL。 ESP-Mesh-Lite目前支持到5.1的SDK,当然4.4也是可以用的。首先上Gitee或G…

AI绘画本地部署Stable Diffusion web UI

AI绘画本地部署Stable Diffusion web UI 一 、项目介绍 A browser interface based on Gradio library for Stable Diffusion. 项目地址:GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 这是一个可以通过直接输入描述性文字文本来生成…

keil调试的时候没问题,下载时候没反应

今天遇到这样一个问题。我下载商家的代码例程后单片机没反应,进入调试的时候一切正常。很奇怪,在网上找了教程问题解决,总结一下。 原因在于程序下载进去后没有按下复位键,导致还是之前的程序。我之前设置的是下载后自动复位运行…

滴答定时器

1.定时与计数的本质 2.滴答定时器的原理 1.向下计数,24位的计数器。滴答定时器属于内核。 每来一个脉冲计数值减一。当为零时。继续把重载寄存器给计数值。然后每来一个脉冲减一。 可以不停重复次操作。 控制寄存器:时钟的选择(bit2)&…

【C语言】通讯录系统实现 (保姆级教程,附源码)

目录 1、通讯录系统介绍 2、代码分装 3、代码实现步骤 3.1、制作菜单menu函数以及游戏运行逻辑流程 3.2、封装人的信息PeoInfo以及通讯录Contact结构体类型 3.3、初始化通讯录InitContact函数 3.4、增加联系人AddContact函数 3.5、显示所有联系人ShowContact函数 3.6、…

对比两个数组中 每个对应位置的元素大小 返回每个对比结果组成的列表 numpy.fmin()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 对比两个数组中 每个对应位置的元素大小 返回每个对比结果组成的列表 numpy.fmin() [太阳]选择题 请问代码中最后输出正确的是? import numpy as np a np.array([1, 3, 6, 8]) …

面试必考精华版Leetcode1372. 二叉树中的最长交错路径

题目: 代码(首刷看解析): class Solution { public:int maxAns;//dir 0 left,1 rightvoid dfs(TreeNode* root,bool dir,int len){maxAnsmax(maxAns,len);if(!dir){if(root->left) dfs(root->left,1,len1);if(root->right) dfs(roo…