【结构型】代理模式(Proxy)

2023-09-15 17:19:13

代理模式(Proxy)

为其他对象提供一种代理以控制对这个对象的访问。Proxy 模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候。

适用场景

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

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

代理模式实例代码(Java)

interface Subject {
    public void buy();
}

class Proxy implements Subject {
    protected RealSubject realSubject;

    public Proxy(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void buy() {
        System.out.println("办理购买前的手续");
        realSubject.buy(); // 付钱
        System.out.println("办理购买后的手续");
    }
}

class RealSubject implements Subject {
    @Override
    public void buy() {
        System.out.println("付钱");
    }
}

public class ProxyPattern {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Proxy proxy = new Proxy(realSubject);

        proxy.buy();
    }
}

其他设计模式详见本专栏其他博文~
特别感谢zst_2001在备考软考期间提供的帮助,贴上博主B站
zst_2001的个人空间

更多推荐

05_2D3D转换

12D转换转换是CSS3中具有颠覆性的一个特征,可以实现元素的位移、旋转、变形、缩放。通过transform转换来实现2D转换或者3D转换。2D转换包括:缩放scale移动translate旋转rotate倾斜skew(了解)1.1缩放scale设置元素的缩放效果,只要给元素添加上了这个属性就能控制它放大还是缩小。语法

ram和rom的区别

ram和rom的区别主要在于:1、性质不同;2、特点不同;3、应用不同。其中性质不同是指RAM是随机存取存储器,也叫主存,是与CPU直接交换数据的内部存储器,而ROM是只读存储器,以非破坏性读出方式工作,只能读出无法写入信息。1、性质不同RAM是随机存取存储器,也叫主存,是与CPU直接交换数据的内部存储器。RAM(ra

地下城规划3d全景vr虚拟现实制作提高沟通效率

地下空间的合理有序开发,不仅形成了强劲的城市发展脉动,也为人们玩转地下空间“潮”生活提供了可能,因此为了更好宣传城市地下空间,引进web3d开发和VR全景制作技术,开发的城市地下空间3D全景虚拟漫游系统为客户提供线上、全新、丰富的交互体验。城市地下空间3D全景虚拟漫游让我们能够全方位、无死角地探索城市地下的神秘世界。进

Ansible自动化:简化你的运维任务

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

PyTorch深度学习(六)【循环神经网络-基础】

RNNCell:h0和x1生成h1,把h1作为输出送到下一次的RNNCell里面。(h1=linear(h0,x1))RNN计算过程:输入先做线性变换,循环神经网络常用的激活函数是tanh(±1区间)。构造RNNCell:代码:importtorch​batch_size=1seq_len=3input_size=4h

C++ Qt零基础入门进阶与企业级项目实战教程与学习方法分享

Qt是一个卓越的客户端跨平台开发框架,可以在Windows、Linux、macOS进行客户端开发,无缝切换,一统三端;当然除了桌面端,在移动端的早期,Qt也展现了其多才多艺,在Android和ios也可以使用Qt编写app,近些年移动端的蓬勃发展,大浪淘沙,Qt已退出移动端开发的舞台,但是在桌面端开发,尤其是跨平台方面

5G通信与蜂窝模组之间的关系

5G通信是第五代移动通信技术的简称,它代表了一种新一代的无线通信技术标准。5G通信的主要目标是提供更高的数据传输速度、更低的延迟、更大的网络容量以及更可靠的连接,以支持各种新兴应用和服务,包括高清视频流、虚拟现实、物联网(IoT)、自动驾驶汽车和远程医疗等。蜂窝模组在5G通信中代表了一种设备或组件,它用于使物联网(Io

SpringBoot集成Prometheus实现监控

SpringBoot配置Prometheuspom.xml引入监控以及prometheus依赖<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency><

软件设计师笔记系列(三)

😀前言随着计算机技术的日益发展,操作系统作为计算机系统的核心组件,其重要性不言而喻。操作系统不仅管理和控制计算机硬件和软件资源,还为用户和其他软件提供服务,使得复杂的计算机系统能够高效、安全和方便地运行。本章将深入探讨操作系统的一些基本概念,如程序与进程、进程的三态模型、死锁及其处理策略,以及磁盘调度算法。通过对这些

【C# Programming】值类型、良构类型

值类型1、值类型值类型的变量直接包含值。换言之,变量引用的位置就是值内存中实际存储的位置。2、引用类型引用类型的变量存储的是对一个对象实例的引用(通常为内存地址)。复制引用类型的值时,复制的只是引用。这个引用非常小(32位机器时4字节引用)3、结构除string和object是引用类型,所有C#内建类型都是值类型。C#

【Kafka系列】(二)Kafka的基本使用

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top首发博客地址[1]文章更新计划[2]系列文章地址[3]Kafka线上集群部署方案怎么做操作系统先说结论,Kafka部署在Linux上要比Windows和Mac上性能高的多,主要是以下几个原因:操作系

热文推荐