设计模式之代理模式ProxyPattern(六)

news2025/1/8 4:38:06

一、代理模式介绍

1、什么是代理模式?

代理模式是一种结构型设计模式,它允许为其他对象提供一个替代品或占位符,以控制对这个对象的访问。

2、代理模式的角色构成

  • 抽象主题(Subject):定义了真实主题和代理主题的共同接口,这样代理类可以通过实现该接口来代理真实主题。
  • 真实主题(Real Subject):定义了代理所代表的真实对象。
  • 代理(Proxy):持有对真实主题的引用,并实现了与真实主题一样的接口,客户端通过代理来访问真实主题,同时可以在访问真实主题前后进行一些额外操作。

3、代理模式的作用

代理模式的主要目的是控制对对象的访问,可以实现一些额外的功能,比如延迟加载、访问控制、日志记录、性能监控等。代理模式在实际开发中有着广泛的应用,比如远程代理、虚拟代理、保护代理等。总的来说,代理模式提供了一种灵活的方式来控制对对象的访问,并且可以在不改变原始对象的情况下实现一些额外的功能。

二、静态代理模式实例Static Proxy

1、Shopping接口

package com.xu.demo.proxyPattern;

//接口
public interface Shopping {

    void buy();
}

 2、真实类RealShopping

package com.xu.demo.proxyPattern;

//真实类
public class RealShopping implements Shopping {

    @Override
    public void buy() {
        System.out.println("购买商品");
    }
}

 3、静态代理类ShoppingProxy

package com.xu.demo.proxyPattern;

//代理类
public class ShoppingProxy implements Shopping {
    private RealShopping realShopping;

    public ShoppingProxy(RealShopping realShopping) {
        this.realShopping = realShopping;
    }

    @Override
    public void buy() {
        System.out.println("开始记录日志");
        realShopping.buy();
        System.out.println("记录日志完成");
    }
}

4、StaticProxy类测试

package com.xu.demo.proxyPattern;

/**
 * 代理类代理接口的实现类调用接口方法
 */
public class StaticProxy {

    public static void main(String[] args) {
        RealShopping realShopping = new RealShopping();
        ShoppingProxy shoppingProxy = new ShoppingProxy(realShopping);
        shoppingProxy.buy();
    }
}

 运行结果:

二、Java动态代理

动态代理是在运行时动态生成代理类,不需要手动编写代理类。Java种的动态代理主要是使用java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler接口实现。

其中最主要的就是Proxy.newProxyInstance方法,它是用于创建动态代理对象的静态方法。它接受三个参数:

  • ClassLoader:用于加载动态代理类的类加载器。
  • interfaces:要代理的接口数组。
  • InvocationHandler:实现了InvocationHandler接口的对象,用于处理代理对象的方法调用。

1、ShoppingInvocationHandler动态代理处理类

package com.xu.demo.proxyPattern;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

// 动态代理处理器
public class ShoppingInvocationHandler implements InvocationHandler {

    private Object target;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("开始记录日志");
        Object result = method.invoke(target, args);
        System.out.println("记录日志完成");
        return result;
    }
}

 2、动态代理类DynamicShoppingProxy

package com.xu.demo.proxyPattern;

import java.lang.reflect.Proxy;

// 动态代理类
public class DynamicShoppingProxy {

    public static Shopping createProxy(RealShopping realShopping) {
        return (Shopping) Proxy.newProxyInstance(
                realShopping.getClass().getClassLoader(),
                realShopping.getClass().getInterfaces(),
                new ShoppingInvocationHandler(realShopping));
    }
}

 3、JDK代理测试类JavaDynamicProxy

运行:

 三、CGLIB动态代理

CGLIB是一个强大的,高性能的代码生成类库,它可以在运行时扩展Java类。CGLIB代理不要求目标对象实现接口,它通过继承目标类生成代理类。

1、引入CGLIB依赖包,如果你是Spring项目的话Spring框架已经自带了CGLIB动态代理需要的依赖包

       <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.3.0</version>
        </dependency>

2、 ShoppingMethodInterceptorCGLIB代理处理器

package com.xu.demo.proxyPattern;

import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

// CGLIB代理处理器
public class ShoppingMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects,
                            MethodProxy methodProxy) throws Throwable {
        System.out.println("开始记录日志");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("记录日志完成");
        return result;
    }
}

 3、CGLIB代理类CglibShoppingProxy

package com.xu.demo.proxyPattern;

import org.springframework.cglib.proxy.Enhancer;

// CGLIB代理类
public class CglibShoppingProxy {
    public static Shopping createProxy() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RealShopping.class);
        enhancer.setCallback(new ShoppingMethodInterceptor());
        return (Shopping) enhancer.create();
    }
}

 4、CGLIB动态代理测试类CglibDynamicProxy

package com.xu.demo.proxyPattern;

/**
 * CGLIB动态代理测试类
 */
public class CglibDynamicProxy {

    public static void main(String[] args) {
        Shopping cglibProxy = CglibShoppingProxy.createProxy();
        cglibProxy.buy();
    }
}

 运行结果:

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

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

相关文章

【算法】【单调栈】【leetcode】1019. 链表中的下一个更大节点

刷这题之前先看&#xff1a; 【算法】【OD算法】【单调栈】找朋友-CSDN博客 【算法】【单调栈】【leetcode】1475. 商品折扣后的最终价格-CSDN博客 【算法】【单调栈】【leetcode】901. 股票价格跨度-CSDN博客 【算法】【单调栈】每日温度-CSDN博客 题目地址&#xff1…

机器人系统ros2-开发实践04-ROS2 中 tf2的定义及示例说明

1. what ros2 tf2 &#xff1f; tf2的全称是transform2&#xff0c;在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;它是专门用于处理和变换不同坐标系间位置和方向的库。这个名字来源于“transform”这个词&#xff0c;表示坐标变换&#xff0c;而“2”则…

【介绍下Unity编辑器扩展】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

学习 Rust 第 23 天:闭包

Rust 闭包提供了简洁、富有表现力的匿名函数来捕获周围的变量。它们简化了代码&#xff0c;提供了存储、参数传递和函数重构方面的灵活性。它们与泛型的交互增强了灵活性&#xff0c;而捕获模式则促进了有效的所有权和可变性管理。从本质上讲&#xff0c;闭包是 Rust 的基础&am…

笔记-用Python脚本启停JAR程序

用Python脚本启停JAR程序&#xff0c;需要用到python中的以下内置模块 subprocess 是 Python 的一个标准库模块&#xff0c;用于在新进程中执行子命令&#xff0c;获取子进程的输入/输出/错误以及返回码等os 是 Python 的一个标准库模块&#xff0c;它提供了与操作系统交互的功…

【web安全】-- 命令执行漏洞详解

本文将从原理开始介绍命令执行漏洞并附有三个实例来供各位客官学习 文章目录 一、什么是命令执行漏洞二、出现的原因三、有可能存在命令执行漏洞的函数&#xff08;php&#xff09;1、利用一些函数来实现命令执行2、直接执行系统命令的函数 四、命令拼接符号1、Windows2、linux…

【Mac】mac 安装 prometheus 报错 prometheus: prometheus: cannot execute binary file

1、官网下载 Download | Prometheus 这里下载的是prometheus-2.51.2.linux-amd64.tar.gz 2、现象 解压之后启动Prometheus 启动脚本&#xff1a; nohup ./prometheus --config.fileprometheus.yml > prometheus.out 2>&1 & prometheus.out日志文件&#xff…

opencv基础篇 ——(十)非真实感渲染

非真实感渲染&#xff08;Non-Photorealistic Rendering, NPR&#xff09;是指通过一系列图像处理技术&#xff0c;将真实感图像转换为具有特定艺术风格或视觉效果的图像&#xff0c;模拟绘画、素描、卡通等非现实主义表现手法。OpenCV 提供了一些内置函数来实现非真实感渲染&a…

医疗大模型华佗GPT-2:医学问答超越GPT-4,通过2023年国家执业药师考试

前言 随着人工智能技术的快速发展&#xff0c;特别是在自然语言处理(NLP)领域&#xff0c;大型预训练模型如GPT系列已经显示出在多个领域的强大应用潜力。最近&#xff0c;华佗GPT-2医疗大模型的发布&#xff0c;不仅标志着人工智能在医学领域的一大进步&#xff0c;更是在202…

Linux IP Forwarding路由转发实验

linux 路由转发功能 Linux 操作系统具备路由转发功能&#xff0c;路由功能是指 Linux 操作系统提供的路由管理和转发功能&#xff0c;它允许 Linux 主机在网络中正确地转发数据包&#xff0c;并确保数据包能够达到其目的地。 出于安全考虑&#xff0c;Linux系统默认是禁止数据…

vscode 检查更新 没有检查更新按钮

vscode 检查更新 没有检查更新按钮 1、问题描述2、问题分析3、解决方法 1、问题描述 今天在使用vscode写markdown文档时&#xff0c;需要粘贴图片到markdown文档中&#xff0c;结果无法粘贴进来&#xff0c;显示如下&#xff1a;只粘贴了image.png这几个字。 2、问题分析 搜索…

交通运输智慧监管平台---强化物流安全与效率的新举措

一、建设背景 随着社会对于交通安全和环境保护的要求不断提高&#xff0c;对卡车运输的监管和合规性要求也逐渐加强。为了满足快速发展的物流需求&#xff0c;提高供应链协同和可追溯性、解决安全问题、提高运输效率和降低成本&#xff0c;我们利用现代技术和信息化手段着力建设…

QT - 创建Qt Widgets Application项目

在Qt中结合OpenGL使用&#xff0c;可以创建一个Qt Widgets应用程序项目。在创建项目时&#xff0c;您可以选择使用OpenGL模板来生成一个已经集成了OpenGL的项目。这个模板会自动帮助您集成OpenGL和Qt&#xff0c;并生成一个基本的OpenGL窗口。您可以在这个窗口中进行OpenGL的开…

搭建大型分布式服务(三十七)SpringBoot 整合多个kafka数据源-取消限定符

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

Spark SQL编程初级实践

参考链接 Spark编程: Spark SQL基本操作 2020.11.01_df.agg("age"->"avg")-CSDN博客 RDD编程初级实践-CSDN博客 Spark和Hadoop的安装-CSDN博客 1. Spark SQL基本操作 { "id":1 , "name":" Ella" , "age":…

深入理解正则表达式:从入门到精通

title: 深入理解正则表达式&#xff1a;从入门到精通 date: 2024/4/30 18:37:21 updated: 2024/4/30 18:37:21 tags: 正则Python文本分析日志挖掘数据清洗模式匹配工具推荐 第一章&#xff1a;正则表达式入门 介绍正则表达式的基本概念和语法 正则表达式是一种用于描述字符串…

Docker安装Nginx端口映射|挂载目录查看

文章目录 前言Docker安装nginx怎么查看端口映射|挂载映射 前言 Docker 的作用主要体现在应用隔离、跨平台部署、快速部署、环境一致性以及资源隔离和管理等方面&#xff0c;为软件开发和运维带来了很多便利和优势。 在服务器&#xff08;虚拟机&#xff09;中安装 Nginx、MyS…

从源头上减少BUG:掌握Java中的label和assert语句!

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

【分享】如何将word格式文档转化为PDF格式

在日常的办公和学习中&#xff0c;我们经常需要将Word文档转换为PDF格式。PDF作为一种通用的文件格式&#xff0c;具有跨平台、易读性高等优点&#xff0c;因此在许多场合下都更为适用。那么&#xff0c;如何实现Word转PDF呢&#xff1f;本文将介绍几种常用的方法&#xff0c;帮…

巧用 TiCDC Syncpiont 构建银行实时交易和准实时计算一体化架构

本文阐述了某商业银行如何利用 TiCDC Syncpoint 功能&#xff0c;在 TiDB 平台上构建一个既能处理实时交易又能进行准实时计算的一体化架构&#xff0c;用以优化其零售资格业务系统的实践。通过迁移到 TiDB 并巧妙应用 Syncpoint&#xff0c;该银行成功解决了原有多个 MySQL 集…