Java中的代理模式:灵活地控制对象访问和行为

        代理模式是一种结构型设计模式,它允许一个对象(代理对象)代替另一个对象(被代理对象)来控制对其的访问。代理对象通常在不改变原始对象的情况下,提供额外的功能或控制访问的方式。在Java编程中,代理模式被广泛应用于各种场景,如远程代理、虚拟代理、安全代理等。本文将深入探讨Java中的代理模式,包括其原理、常见类型以及实际应用。

#### 1. 代理模式基础

代理模式有三个主要角色:

- **抽象主题(Subject)**:定义了被代理对象和代理对象的共同接口,这样代理对象可以替代被代理对象被使用。
- **真实主题(Real Subject)**:是被代理的对象,实现了抽象主题接口,是代理模式中的实际执行者。
- **代理(Proxy)**:代理对象持有对真实主题的引用,并实现了抽象主题接口。代理通常在执行真实主题之前或之后执行额外的逻辑。

#### 2. 静态代理

静态代理是在编译时确定代理关系的一种代理方式,代理类在编译阶段就已经确定。这种方式简单直接,但对于每个被代理类都需要创建一个代理类,不够灵活。

**示例**:
```java
interface Subject {
    void request();
}

class RealSubject implements Subject {
    public void request() {
        System.out.println("Real subject is doing something.");
    }
}

class Proxy implements Subject {
    private RealSubject realSubject;

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

    public void request() {
        System.out.println("Proxy is doing something before calling real subject.");
        realSubject.request();
        System.out.println("Proxy is doing something after calling real subject.");
    }
}
```

#### 3. 动态代理

动态代理是在运行时生成代理类的一种代理方式,无需为每个被代理类创建一个代理类,使得代理更为灵活。Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`InvocationHandler`接口来实现。

**示例**:
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Subject {
    void request();
}

class RealSubject implements Subject {
    public void request() {
        System.out.println("Real subject is doing something.");
    }
}

class DynamicProxy implements InvocationHandler {
    private Object target;

    public DynamicProxy(Object target) {
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Proxy is doing something before calling real subject.");
        Object result = method.invoke(target, args);
        System.out.println("Proxy is doing something after calling real subject.");
        return result;
    }
}

// 使用动态代理
Subject realSubject = new RealSubject();
Subject proxy = (Subject) Proxy.newProxyInstance(
    realSubject.getClass().getClassLoader(),
    realSubject.getClass().getInterfaces(),
    new DynamicProxy(realSubject)
);
proxy.request();
```

#### 4. 应用场景

代理模式在许多场景中都有应用,如:

- **远程代理**:控制对远程对象的访问。
- **虚拟代理**:控制对创建开销大的对象的访问。
- **安全代理**:控制对对象的访问权限。

#### 5. 总结

代理模式是一种强大的设计模式,在Java编程中有着广泛的应用。通过代理模式,我们可以更加灵活地控制对对象的访问和行为,实现了对对象的透明性、安全性和可扩展性的增强。希望本文的介绍能

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

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

相关文章

大数据开发面试题【数仓篇】

197、数据仓库和传统数据库区别 由于历史数据使用频率过低,导致数据堆积,查询性能下降;用于查询分析,涉及大量的历史数据,数据仓库中的数据一般来日志文件和事务 数据库是跟业务挂钩的,数据库不可能装下一…

教育新篇章:AI工具Sora引领学习新趋势

Sora——这个让人在24年初引爆AI圈的新产品,它究竟会如何改变我们的教育领域呢? 从gpt到Sora,从对话型的ai到游戏和短剧制作的新风口,我们从23年到24年一个接一个地被震惊! Sora能够根据文本提示生成高质量的视频内容…

当 GIS 遇上 AI 大模型

今年整个 IT 界、甚至科技界最火爆的技术就是 AI 大模型了,没有之一。 以 OpenAI 的 GPT 为代表、国内外一众大模型跟进,形成了百模齐奔的态势。围绕着大模型,各项周边的应用也在快速发展。在 2023 年年底的云栖大会上,论坛标题带…

LVM部署手册

目录 前言 一、LVM的基本概念 二、LVM的特点 三、LVM的应用场景 四、总结 资源列表 一、基础环境 关闭防火墙 关闭内核安全机制 设置主机名 二、磁盘分区 使用fdisk命令将磁盘划分为三个主分区 将这三个分区ID标记好修改为”8e“ 三、创建物理卷 创建物理卷 查…

Vue3(TypeScript)-CSSProperties代码示例及用法详解

Vue3-CSSProperties代码示例及用法 在Vue3中封装一个可复用的公共CSSProperties // 目录 /xxx/src/hooks/use-scroll-updown-bottom-content/index.ts 全局定义hooks import { computed } from vue import type { CSSProperties } from vuetype UpDownOperationType up | down…

一个基于预训练的DenseNet121模型的人脸年龄分类系统

这篇文章采用预训练的DenseNet121模型并使用自定义的数据集类和自定义的类似正态分布的标签平滑策略来训练了一个人脸年龄分类模型,最后基于这个模型用tk实现了一个娱乐向的小系统。 数据集展示: 两个文件夹,分别是训练集和测试集&#xff0…

Bootstrap 3.x 版本基础引入指南

Bootstrap 是一款广受欢迎的前端框架,它简化了网页设计与开发流程,帮助开发者快速创建响应式布局和美观的网页界面。本文将向您介绍如何在项目中引入 Bootstrap 3.x 版本的基本步骤,包括 CSS 和 JavaScript 文件的引用,以及必要的…

java根据不同类型跳转相应的实现类

1 不同实现类字典 AllArgsConstructor Getter public enum SendMessageEnum {HUAWEI("AndHWPush"),JIGUANG("AndJPush"),MEIZU("AndMZPush"),OPPO("AndOppoPush"),XIAOMI("AndXMPush"),XINGE("AndXinGePush"),;p…

Java跨Docker容器备份数据库数据

Java跨Docker容器备份数据库数据 前置背景思路整理编写备份脚本容器启动检验效果Java容器MySQL容器 Java代码执行备份 我的个人博客:Lichg,欢迎大家访问。 前置背景 在我们的开发部署场景中,通常多数使用Docker进行部署。当你的数据库和项目…

【吊打面试官系列】Java高并发篇 - 什么是乐观锁和悲观锁?

大家好,我是锋哥。今天分享关于 【什么是乐观锁和悲观锁?】面试题,希望对大家有帮助; 什么是乐观锁和悲观锁? 1、乐观锁: 就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态, 乐观锁认为竞争…

ICML 2024 多视角融合驱动的通用具身操作算法SAM-E,为机器人学习复杂操作给出了可行解决方案

当我们拿起一个机械手表时,从正面会看到表盘和指针,从侧面会看到表冠和表链,打开手表背面会看到复杂的齿轮和机芯。每个视角都提供了不同的信息,将这些信息综合起来才能理解操作对象的整体三维。 想让机器人在现实生活中学会执行…

【2024上半年软考】软件设计师答案

软件设计师 群策群力 仅供参考 ①数据库权限应该选revoke ②工作在数据链路层的设备是交换机 ③结构化思维:自上而下分解 ④链表需要遍历的是删除最后一个元素 ⑤磁盘是辅存 ⑥瀑布模型不够灵活 ⑦软件测试路径覆盖程度最高 ⑧29个数字最多查找5次的是有序数组进行二…

nuxt2移动端适配,处理移动端引入的组件库大小不正常显示

版本 "postcss-pxtorem": "^5.1.1" "nuxt": "^2.14.7"安装 npm i -D postcss-pxtorem5.1.1postcss.config.js 排除组件库适配,解决组件库大小在页面不正常显示 const pxToRem require(postcss-pxtorem) module.exports …

AI小天才:让你轻松掌握机器学习之K近邻

课程链接:AI小天才:让你轻松掌握机器学习 K近邻(K-Nearest Neighbors,简称KNN)算法是一种常用的监督学习算法,用于分类和回归任务。KNN算法的基本原理是通过找出与新样本最近的K个训练样本,并根…

【stm32】江科协听课笔记

[3-1] GPIO输出_哔哩哔哩_bilibili 5.GPIO输出 这里,寄存器就是一段特殊的存储器,内核可以通过APB2总线队寄存器进行读写,这样就可以完成输出/读取电平的功能。寄存器的每一位对应一个引脚,stm32是32位的,这里的寄存器…

【工具】珍藏免费宝藏工具,不好用你来捶我

前言 🍊缘由 藏在我硬盘里的好东西,必须跟小伙伴们分享 东西很好,必须分享。良辰吉日,跟大家分享几款神仙级小工具,实际亲测,不好来锤。 正文 一.影刀 影刀可以使任何操作系统、桌面软件、Web程序的自动…

怎么搭建微信留言板功能

在信息爆炸的时代,微信已经成为了我们日常生活中不可或缺的一部分。它不仅仅是一个简单的聊天工具,更是一个充满无限可能的营销平台。今天,我要向大家介绍的是如何在你的微信平台上搭建一个独具特色的留言板功能,让用户能够自由发…

PyTorch的数据处理

💥今天看一下 PyTorch数据通常的处理方法~ 一般我们会将dataset用来封装自己的数据集,dataloader用于读取数据 Dataset格式说明 💬dataset定义了这个数据集的总长度,以及会返回哪些参数,模板: from tor…

ubuntu部署gitblit

在Ubuntu上部署Gitblit可以通过以下步骤进行: 安装Java环境: Gitblit需要Java运行环境,可以通过OpenJDK进行安装。 sudo apt update sudo apt install openjdk-11-jdk下载Gitblit: 从Gitblit官方网站下载最新的Gitblit WAR文件…

51-54 Sora能制作动作大片还需要一段时间 | DrivingGaussian:周围动态自动驾驶场景的复合高斯飞溅

24年3月,北大、谷歌和加州大学共同发布了DrivingGaussian: Composite Gaussian Splatting for Surrounding Dynamic Autonomous Driving Scenes。视图合成和可控模拟可以生成自动驾驶的极端场景Corner Case,这些安全关键情况有助于以更低成本验证和增强自…