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

一、代理模式介绍

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();
    }
}

 运行结果:

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

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

相关文章

FineBI学习:K线图

效果图 底表结构&#xff1a;日期、股票代码、股票名称、开盘价、收盘价、最高价、最低价 步骤&#xff1a; 横轴&#xff1a;日期 纵轴&#xff1a;开盘价、最低价 选择【自定义图表】&#xff0c;或【瀑布图】 新建字段&#xff1a;价差&#xff08;收盘-开盘&#xf…

鸿蒙准备1

鸿蒙心路 感慨索性&#xff0c; 看看鸿蒙吧。打开官网相关介绍 新建工程目录结构 感慨 最近面试Android应用开发&#xff0c;动不动就问framework的知识&#xff0c;什么touch事件的触发源是啥&#xff08;eventHub&#xff09;&#xff0c;gc流程是啥&#xff0c;图形框架是什…

VS2022 .Net6.0 无法打开窗体设计器

拿Vs2022 建了个Demo&#xff0c;运行环境是net6.0-windows&#xff0c;无论双击或是右键都打不开窗体设计器 打开项目目录下的*.csproj.user <?xml version"1.0" encoding"utf-8"?> <Project ToolsVersion"Current" xmlns"htt…

【Hadoop】-Hive客户端:HiveServer2 Beeline 与DataGrip DBeaver[14]

HiveServer2 & Beeline 一、HiveServer2服务 在启动Hive的时候&#xff0c;除了必备的Metastore服务外&#xff0c;我们前面提过有2种方式使用Hive&#xff1a; 方式1&#xff1a; bin/hive 即Hive的Shell客户端&#xff0c;可以直接写SQL方式2&#xff1a; bin/hive --…

llama_index微调BGE模型

微调模型是为了让模型在特殊领域表现良好,帮助其学习到专业术语等。 本文采用llama_index框架微调BGE模型,跑通整个流程,并学习模型微调的方法。 一、环境准备 Linux环境,GPU L20 48G,Python3.8.10。 pip该库即可。 二、数据准备 该框架实现了读取各种类型的文件,给…

C++学习第十六课:宏与模板的基础讲解示例

C学习第十六课&#xff1a;宏与模板的深度解析 宏和模板是C中两个强大的特性&#xff0c;它们都允许编写灵活且通用的代码。宏通过预处理器实现&#xff0c;而模板则是C的编译时特性。本课将深入探讨宏的定义、使用以及潜在的问题&#xff0c;以及模板的基本使用、特化、偏特化…

LeetCode 110.平衡二叉树(Java/C/Python3/Go实现含注释说明,Easy)

标签 树深度优先搜索递归 题目描述 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡的二叉树定义为&#xff1a; 一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。 原题&#xff1a;LeetCode 110.平衡二叉树 思路及…

羽毛多肽复合纳米纤维膜

羽毛多肽复合纳米纤维膜是一种结合了羽毛多肽和其他纳米纤维材料&#xff08;如P(MA-AA)等&#xff09;的新型生物材料。这种复合纳米纤维膜通过引入羽毛多肽&#xff0c;进一步提升了其生物相容性、生物活性以及吸附性能。 羽毛多肽作为一种天然生物材料&#xff0c;具有良好的…

Centos7+Hadoop3.3.4+KDC1.15+Ranger2.4.0集成

一、集群规划 本次测试采用3台虚拟机&#xff0c;操作系统版本为centos7.6。 kerberos采用默认YUM源安装&#xff0c;版本为&#xff1a;1.15.1-55 Ranger版本为2.4.0 系统用户为ranger:ranger IP地址主机名KDCRanger192.168.121.101node101.cc.localKDC masterRanger Admin…

Spring6 当中的 Bean 循环依赖的详细处理方案+源码解析

1. Spring6 当中的 Bean 循环依赖的详细处理方案源码解析 文章目录 1. Spring6 当中的 Bean 循环依赖的详细处理方案源码解析每博一文案1.1 Bean的循环依赖1.2 singletion 下的 set 注入下的 Bean 的循环依赖1.3 prototype下的 set 注入下的 Bean 的循环依赖1.4 singleton下的构…

MouseBoost PRO for Mac激活版:强大的 鼠标增强软件

在追求高效工作的今天&#xff0c;MouseBoost PRO for Mac成为了许多Mac用户的得力助手。这款功能强大的鼠标增强软件&#xff0c;以其独特的智能化功能和丰富的实用工具&#xff0c;让您的电脑操作更加便捷、高效。 MouseBoost PRO for Macv3.4.0中文激活版下载 MouseBoost PR…

Hotcoin Research | 市场洞察:2024年4月22日-28日

加密货币市场表现 本周内加密大盘整体呈现出复苏状态&#xff0c;在BTC减半后进入到震荡上行周期。BTC在$62000-66000徘徊&#xff0c;ETH在$3100-3300徘徊&#xff0c;随着港交所将于 4 月 30 日开始交易嘉实基金的比特币和以太坊现货 ETF&#xff0c;周末行情有一波小的拉升…

帮助 Python 用户构建 CLI 界面:直观易写、简单高效 | 开源日报 No.240

tiangolo/typer Stars: 13.7k License: MIT typer 是一个构建出色命令行界面&#xff08;CLI&#xff09;的库&#xff0c;基于 Python 类型提示。它旨在让开发者轻松创建用户喜欢使用的 CLI 应用程序。其主要功能和核心优势包括&#xff1a; 直观易写&#xff1a;强大编辑器…

vue3 jspdf,element table 导出excel、pdf,横板竖版分页

多个表格需要&#xff0c;pdf需要的格式与原本展示的表格样式不同 1.创建一个新的表格&#xff0c;设置pdf需要的样式&#xff0c;用vue的h函数放入dom中 2.excel用xlxs插件直接传入新建el-table的dom,直接导出 3.pdf导出类似excel黑色边框白底黑字的文件&#xff0c;把el-t…

FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流

OBS是一个开源的直播录制软件&#xff0c;英文全称叫做Open Broadcaster Software&#xff0c;广泛用于视频录制、实时直播等领域。OBS不但开源&#xff0c;而且跨平台&#xff0c;兼容Windows、Mac OS、Linux等操作系统。 OBS的官网是https://obsproject.com/&#xff0c;录制…

STM32利用硬件I2C读取MPU6050陀螺仪数据

有了前面的基本配置&#xff0c;这节读取MPU6050的数据还算是简单&#xff0c;主要就是初始化时给MPU6050一些配置&#xff0c;取消睡眠模式&#xff0c;MPU6050开机是默认睡眠模式的&#xff0c;读写无效&#xff0c;所以上来就要先更改配置&#xff1a; MPU6050寄存器初始化…

mongodb卸载(win)

关闭服务 &#xff08;或者cmd卸载服务&#xff1a;&#xff09; net stop 服务名称卸载应用 至此&#xff0c;卸载完成&#xff01;

微隔离实施五步法,让安全防护转起来

前言 零信任的最核心原则→最小权限 安全的第一性原理→预防 零信任的最佳实践→微隔离 “零信任”这个术语的正式出现&#xff0c;公认是在2010年由Forrester分析师John Kindervag最早提出。时至今日&#xff0c;“零信任”俨然已成安全领域最热门的词汇&#xff0c;做安全…

实验报告5-Spring MVC实现页面

实验报告5-SpringMVC实现页面 一、需求分析 使用Spring MVC框架&#xff0c;从视图、控制器和模型三方面实验动态页面。模拟实现用户登录&#xff0c;模拟的用户名密码以模型属性方式存放在Spring容器中&#xff0c;控制器相应用户请求并映射参数&#xff0c;页面收集用户数据或…

设计模式-01 设计模式单例模式

设计模式-01 设计模式单例模式 目录 设计模式-01 设计模式单例模式 1定义 2.内涵 3.使用示例 4.具体代码使用实践 5.注意事项 6.最佳实践 7.总结 1 定义 单例模式是一种设计模式&#xff0c;它确保一个类只能被实例化一次。它通过在类内部创建类的唯一实例并提供一个全…