23种设计模式之代理模式

代理模式

1、概念

代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问

代理模式是常用的结构型设计模式之一,在Java RMI、Web Service、Spring AOP等技术和框架中都使用了代理模式

2、代理模式结构

  • Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题
  • Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象。通常,在代理主题角色中客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯调用真实主题对象中的操作。
  • RealSubject(真实主题角色):它定义了代理角色所代表的真实对象。

代理模式结构图

3、示例

Subject 创建Object接口

public interface Object {
    void action();
}

RealSubject 创建ObjectImpl类实现Object

public class ObjectImpl implements Object{
    @Override
    public void action() {
        System.out.println("========");
        System.out.println("========");
        System.out.println("这是被代理的类");
        System.out.println("========");
        System.out.println("========");
    }
}

Proxy 创建ProxyObject

public class ProxyObject implements Object {

    private Object obj;

    public ProxyObject() {
        System.out.println("这是代理类");
        obj = new ObjectImpl();
    }

    @Override
    public void action() {
        System.out.println("代理开始");
        obj.action();
        System.out.println("代理结束");
    }
}

创建测试类

public class Client {
    public static void main(String[] args) {
        ProxyObject proxyObject = new ProxyObject();
        proxyObject.action();
    }
}

运行结果

这是代理类
代理开始
========
========
这是被代理的类
========
========
代理结束

4、代理模式的优缺点

4.1优点
  • 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
  • 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性
4.2缺点
  • 有些类型的代理模式可能会造成处理速度变慢,例如保护模式
  • 实现代理模式需要额外的工作,有些代理模式的实现过程较为复杂

5、代理模式适用模式

1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表。

2.虚代理(VirtualProxy)根据需要创建开销很大的对象。

3.保护代理(ProtectionProxy)控制对原始对象的访问。

4.智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】Linux

Linux 1、 介绍 1.1、概述 1.2、特点 1.3、Linux的发行版2、 基础篇 —— 文件系统 2.1、文件系统 2.2、目录结构3、 基础篇 —— VI/VIM 编辑器 3.1、概述 3.2、编辑器模式及常用命令4、 基础篇 —— 网络配置 4.1、VMware NetWork …

公司面试题总结(二)

7. 说说 JavaScript 中的数据类型?存储上的差别? • 基本类型: o Number o String o Boolean o Undefined o null o symbol • 引用类型 o Object o Array o Function • 声明变量时不同的内存地址分配: o 简单类型的…

leetcode刷题记录37-2476. 二叉搜索树最近节点查询

问题描述 给你一个 二叉搜索树 的根节点 root ,和一个由正整数组成、长度为 n 的数组 queries 。 请你找出一个长度为 n 的 二维 答案数组 answer ,其中 answer[i] [mini, maxi] : mini 是树中小于等于 queries[i] 的 最大值 。如果不存在这…

机器学习实验------PCA

目录 一、介绍 二、算法流程 (1)数据中心化 (2)计算协方差矩阵 (3)特征值分解 (4)选择特征 三、运行结果展示 四、实验中遇到的问题 五、PCA的优缺点 优点: 缺点…

macbook本地部署 pyhive环境连接 hive用例

前言 公司的测试和生产环境中尚未提供基于Hive的客户端。若希望尝试操作Hive表,目前一个可行的方案是使用Python语言,通过借助pyhive库,您可以对Hive表进行各种操作。以下是一些示例记录供您参考。 一、pyhive是什么? PyHive是一…

计算机网络 —— 运输层(运输层概述)

计算机网络 —— 运输层(运输层概述) 运输层运输层端口号复用分用复用(Multiplexing)分用(Demultiplexing) 常用端口号页面响应流程 我们今天进入到运输层的学习: 运输层 我们之前学习的物理层…

Vitis HLS 学习笔记--矢量数据类型

目录 1. 简介 2. 用法详解 2.1 存储器布局 2.2 示例展示 2.3 综合报告 3. 总结 1. 简介 在 Vitis HLS 中,矢量数据类型是一种特殊的数据类型,它允许你一次处理多个数据元素,就像一排并排的盒子,每个盒子里都装着一个数据元…

短视频矩阵源码---矩阵托管1000个账号如何正规开发规则实现

一、短视频矩阵源码开发实现规则: 1.首先是确保各个官方平台api接口的稳定性,一定要是各个平台正规的api 2.其次是保证服务器运行,带宽保证能够并行,目前我们这边用的是源码所需服务器配置:规格:最低8核16G2、硬盘:系…

易舟云财务软件:引领财务数字化转型的新篇章

在数字化浪潮的推动下,财务软件已经成为企业财务管理不可或缺的工具。而易舟云财务软件,作为一款深受用户喜爱的财务管理系统,正引领着财务数字化转型的新篇章。 财务软件行业背景与易舟云的定位 财务软件行业正经历着前所未有的变革。随着《…

视频行人搜索 (Person Search in Videos)

文章目录 视频行人搜索 (Person Search in Videos)图像行人搜索存在问题Video PS 定义MTA-PS数据集First person search dataset in videosComplicated ambient conditions and realistic monitoring scenariosPrivacy insensitivity 方法 视频行人搜索 (Person Search in Vide…

数字芯片——时钟与复位

关于此次章节我想要探讨的问题是门控时钟的处理(Clock Gating Methodology)和时钟复位策略。在低功耗设计中,门控时钟是结构最简洁,最容易实现的电路结构。如上期所讲的,一个控制信号和时钟逻辑与在一起输出的信号作用…

万界星空科技定制化MES系统,实现数字化生产

一、MES生产管理系统强调三个方面: 1、MES是对整个车间制造过程的优化,而不是单一的解决某个生产瓶颈。 2、MES必须提供实时收集生产过程中数据的功能,并作出相应的分析和处理。 3、MES需要与计划层和控制层进行信息交互,通过企业…

程序员,真有不变的技术和稳定的工作吗?

在程序员这个充满变化和创新的领域,很多人追求“稳定”的工作,认为找到一个合适的公司和岗位就能安心一辈子。然而,技术的快速更新迭代和市场需求的不断变化,使得真正的稳定变得越来越难以捉摸。作为程序员,我们需要反…

C# Winform内嵌窗体(在主窗体上显示子窗体)

在开发Winform项目中,经常会要切换不同的窗体。通常程序都有一个主窗体,在切换窗体时往往需要关闭其他子窗体,这个实例就来介绍MDI主窗体内嵌子窗体的实现方法。 MDI主窗体要设置一个比较重要的属性,IsMdiContainertrue。子窗体的…

【云原生】创建harbor私有仓库及使用aliyun个人仓库

1.安装docker #删除已有dockersystemctl stop docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine #安装docker yum install -y docker-ce-20.10.1…

NLP中的Tokenizer分词器的概念与实现

Tokenizer 在开始学习 NLP 相关知识之前,先要学习一个叫 Tokenizer 的概念,这可谓是所有 NLP 模型开始训练前需要做的一个步骤,那么 Tokenizer 是什么? 在计算机处理一行语句的时候,我们给其输入一个 String&#xff…

Android Media Framework(五)Tunnel Mode

本篇将聚焦Android Tunnel Mode,详细解析组件之间隧道连接过程、数据传递过程、组件销毁过程。通过阅读本篇内容,我们应能对tunneled组件的连接过程和buffer分配过程有所了解。 1、Tunnel Mode介绍 IL Spec详细描述了Tunnel Component的实现方式&#x…

【ArcGISProSDK】OpenItemDialog打开文件对话框

打开单个文件 效果 代码 public async void OpenFunction() {// 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;OpenItemDialog openItemDialog new OpenItemDialog() { Title "打开要素文件",InitialLocation gdbPath,Filter ItemFilte…

Linux 性能优化实战

文章目录 33 | 关于 Linux 网络,你必须知道这些(上)设计高并发架构需要考虑什么?如何理解分布式?如何理解云计算?如何理解微服务?TCP/IP网络分层模型是什么?每一层的功能是什么&…

矩阵练习2

48.旋转图像 规律: 对于矩阵中第 i行的第 j 个元素,在旋转后,它出现在倒数第i 列的第 j 个位置。 matrix[col][n−row−1]matrix[row][col] 可以使用辅助数组,如果不想使用额外的内存,可以用一个临时变量 。 还可以通…