设计模式(十三)代理模式

2023-11-05

代理模式也是一种结构性模式,它的主要作用是创建一个现有对象的代理,以便我们能够针对对象的生命周期、访问权限等进行控制。代理模式和适配器模式的区别是:适配器模式主要用于现有接口和新接口之间的转换和衔接,而代理模式对现有接口进行控制,所以代理模式不能改变对象的接口。

假设我们有一个字符资源类,它实现了资源接口,并且能够随意设置字符串的值。

public interface Resource {
    String getResource();
}

public class StringResource implements Resource {
    private String content;

    public StringResource(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String getResource() {
        return content;
    }
}

为了对字符资源进行控制,我们可以创建一个代理,这个代理同样实现了资源接口,但是我们可以在访问资源的时候对资源进行控制,比如这里就取消了访问器方法,让资源变成了只读的。

public class StringResourceProxy implements Resource {
    private Resource resource;

    public StringResourceProxy(Resource resource) {
        this.resource = resource;
    }

    @Override
    public String getResource() {
        return "In proxy:" + resource.getResource();
    }
}

这样,我们可以将代理对象当做实际对象来使用,而且还不会造成未知的风险。

    public void run() {
        Resource resource = new StringResource("Some resource");
        System.out.println(resource.getResource());

        Resource resourceProxy = new StringResourceProxy(resource);
        System.out.println(resourceProxy.getResource());
    }

代理模式的应用非常广泛。我们上面这个例子是静态代理,也就是需要我们手动编写一个代理类。在一些语言例如Java中还支持动态代理,我们不必完整的编写一个代理类,只需要调用相关类和方法即可实现代理模式了。动态代理在Spring AOP等很多框架里都有应用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式(十三)代理模式 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url

随机推荐

  • 关于GD32E230进入睡眠后无法烧录程序解决方法

    软件安装 1 到GD32官网兆易创新 gd32mcu com 找到下图文件下载并安装 2 安装软件 傻瓜式安装 就不多讲了 直接一步到底 3 进入主题 打开刚刚下载好的软件 开发板设置 1 连接开发板上的串口 2 进入BOOT0模式 接3
  • linxu下c/c++遍历文件夹获取文件

    最近工作需要 需要遍历文件夹下的文件 但是我发现遇到两个非常有意思的问题 记录一下 测试的平台为 PC linux Tina linux Linux version 5 15 0 41 generic buildd lcy02 amd64
  • JDK JRE JVM之间的关系

    文章目录 1 从定义的角度解释JDK JRE JVM 2 详细介绍JDK 3 详细介绍JRE 4 详细介绍JVM 1 JVM内部区域划分 5 如何运行一个java程序 本篇文章仅仅是个人片面观点 可能有错误或者表述不清的地方 1 从定义的角
  • Flink从入门到放弃(九)-万字讲解CDC设计(1)

    一 准备工作 在开始研究Flink CDC原理之前 本篇先以CDC1 0版本介绍 后续会延伸介绍2 0的功能 需要做以下几个工作 本篇以Flink1 12环境开始着手 打开Flink官网 查看Connector模块介绍 打开Github 下
  • Unicode与JavaScript详解

    上个月 我做了一次分享 详细介绍了Unicode字符集 以及JavaScript语言对它的支持 下面就是这次分享的讲稿 一 Unicode是什么 Unicode源于一个很简单的想法 将全世界所有的字符包含在一个集合里 计算机只要支持这一个字
  • 水箱建模最小二乘法_Comsol Multiphysics for Mac(建模仿真软件)

    COMSOL Multiphysics 是一款全球通用的基于高级数值方法和模拟物理场问题的通用软件 拥有 网格划分 研究和优化 求解器 可视化和后处理 仿真 App等相关功能 轻松实现各个环节的流畅进行 它能够解释耦合或多物理现象 附加产品
  • oracle 19c rac asm磁盘绑定的方法

    multipath 通过scsi id udev 通过scsi id oracle AFD 直接绑定后在 dev oracleafd disks 下面生成设备文件 asmcmd afd label OCR1 dev sda init 虚拟机
  • 【华为OD机试真题 JAVA】数组二叉树

    JS版 华为OD机试真题 JS 数组二叉树 标题 数组二叉树 时间限制 1秒 内存限制 262144K 语言限制 不限 二叉树也可以用数组来存储 给定一个数组 树的根节点的值存储在下标1 对于存储在下标N的节点 它的左子节点和右子节点分别存
  • QT-自定义消息提示框,好看大气

    QT 自定义消息提示框 好看大气 前言 一 演示效果 二 关键程序 三 下载链接 前言 原生的QT提示框总是让人觉得难以接受 因此特定重新封装一个类来替换原生的 使用过程跟原生的一致 使用比较方便 一 演示效果 二 关键程序 include
  • PHP常见加密函数(总结)

    1 加密算法汇总 比较常用的算法 md5 加密 crypt 加密 sha1加密 URL编码加密 base64编码加密 信息加密技术分为三类 单项散列加密 对称散列加密 非对称散列加密 1 1单项散列加密 MD5加密 crypt 加密 sha
  • 数据结构——深度优先遍历(DFS)无向连通图

    以下是数据结构中关于深度优先遍历无向连通图的操作 编程风格参考严蔚敏版数据结构 其实深度优先遍历就是二叉树的先序遍历的推广 头文件以及宏定义 include
  • css渐变

    1 线性渐变 是从一个方向到另一个方向的渐变 属性值 background linear gradient 颜色 默认值 从上到下线性渐变 代码 结果 属性延伸 1 改变渐变方向 从下到上 background linear gradien
  • RecyclerView 网格布局是设置分割线

    1 分割线 public class DividerGridItemDecoration extends RecyclerView ItemDecoration private static final int ATTRS new int
  • 在用apt install中如何选择安装路径?

    apt install并不会选择软件包的安装路径 这个路径是在软件包里面记录好路径的相关信息的 一个deb包 只是一堆文件 文件夹的压缩包而已 而这个包里面记录了这些文件 文件夹应该安装的位置 因此 简单点说 你不能够在apt instal
  • 图解多态原理

    虚函数表 class Base public virtual void Func1 cout lt lt Func1 lt lt endl private int b 1 void test Base b cout lt
  • 空间(蓝桥杯)

    空间 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 小蓝准备用 256MB 的内存空间开一个数组 数组的每个元素都是 32 位 二进制整数 如果不考虑程序占用的空间和维护内存需要的辅助空间 请问 256MB 的空间
  • 定义内部类 继承 AsyncTask 来实现异步网络请求

    异步任务处理 创建内部类 来实现网络异步请求 新建内部类 继承 AsyncTask SuppressLint StaticFieldLeak class RequestNetworkDataTask extends AsyncTask
  • Docker、Portainer、K8S环境搭建

    Docker Portainer K8S环境搭建 安装Docker 安装步骤 安装依赖包 yum install y yum utils device mapper persistent data lvm2 配置阿里云yum源 以便加速下载
  • Vue 安装开发者工具

    1 下载开发者工具 下载地址 http book wiyp top App Vue3开发者工具 谷歌 Vue3 crx 2 打开谷歌浏览器 点击扩展 点击管理扩展程序 3 开启开发者模式 将 Vue3 开发者工具文件拖拽到浏览器中进行安装
  • 设计模式(十三)代理模式

    代理模式也是一种结构性模式 它的主要作用是创建一个现有对象的代理 以便我们能够针对对象的生命周期 访问权限等进行控制 代理模式和适配器模式的区别是 适配器模式主要用于现有接口和新接口之间的转换和衔接 而代理模式对现有接口进行控制 所以代理模