设计模式之代理模式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 {@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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 {@Overridepublic 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.mzph.cn/bicheng/5385.shtml

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

相关文章

【java9】java9新特性之模块化

Java9模块化是Java9版本中引入的一个重要特性&#xff0c;通过Java Platform Module System (JPMS)实现。这个特性允许开发者将大型应用程序拆分成相互独立的模块&#xff0c;每个模块包含一组相关的功能和资源。 关键概念与语法 下面是Java9模块化的一些关键概念和语法&…

记一次使用Notepad++正则表达式批量替换SQL语句

目录 一、需求二、解决方案三、正则解析 一、需求 存在如下SQL建表脚本&#xff1a; CREATE TABLE "BUSINESS_GOODS" ( "ID" VARCHAR(32) NOT NULL, "GOODS_CODE" VARCHAR(50), "GOODS_NAME" VARCHAR(100), ... NOT CLUSTER PRIMARY…

selenium之document.querySelector()方法

document.querySelector()方法 1. 常用的三种获取元素的js方式 document.getElementById("");document.getElementsByClassName();document.getElementsByTagName(); var docdocument;var boxdoc.getElementById("box");var libox.getElementsByTagName(…

Ceph PG

概述 为了实现不同存储池之间的策略隔离&#xff0c;以及针对不同用途的存储池指定不同的容灾策略&#xff0c;ceph crush使用中间结构即Placement Group&#xff08;后续均以PG简称&#xff09;将应用数据对象进行映射后&#xff0c;写入OSD本地存储设备。PG也是我们日常运维…

常见的 HTML 标准

常见的 HTML 标准 常见的 HTML 标准发布历史 HTML&#xff08;Hypertext Markup Language&#xff09;有多个版本和标准。以下是一些常见的 HTML 标准&#xff1a; HTML 2.0&#xff1a;于1995年发布&#xff0c;是 HTML 的第一个正式标准。HTML 3.2&#xff1a;于1997年发布…

刷代码随想录有感(50):路径总和

题干&#xff1a; 代码; class Solution { public:bool traversal(TreeNode* node, int count){if(node NULL)return false;if(!node -> left && !node -> right && count 0)return true;if(!node -> left && !node -> right &&…

python挑战10秒小程序

目录 一.前言 二.代码 三.分析 一.前言 >1.小程序开始时,会出现一个倒计时器,从10秒开始。 >2.玩家需要集中注意力并估计10秒钟过去的时间。 >3.当玩家认为10秒钟已经过去时,需要点击屏幕上的按钮。 >4.小程序会显示玩家的点击时间,以及与实际10秒钟的时间…

wetrtc简介

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种实时通信技术&#xff0c;它允许网络应用或站点在无需中间媒介的情况下&#xff0c;直接在浏览器之间建立点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现音频、视频流或其他任意数据的实时…

泰勒创造力达到顶峰?(上)

hello,大家好&#xff01;今天看一篇经济学人的一篇评论&#xff0c;说的是泰勒斯威夫特当前的创造力。经济学人总是语不惊人死不休&#xff0c;看看它对这位音乐天才做了怎样的评价。 事先声明哈&#xff0c;本文就是一种英语学习类讲述&#xff0c;没带任何个人色彩&#xff…

网络舆情分析:利用自然语言处理(NLP)洞察公众情绪

&#x1f310; 网络舆情分析&#xff1a;利用自然语言处理&#xff08;NLP&#xff09;洞察公众情绪 &#x1f4ca; 概述 在数字化时代&#xff0c;公众情绪和舆论对企业品牌、政治决策乃至社会趋势都有着深远的影响。通过自然语言处理&#xff08;NLP&#xff09;技术&#…

北京金融大数据有限公司X百望云签署战略合作协议 共同发布“金数数据要素流通云平台”

随着数据资产与数据要素相关政策密集出台&#xff0c;资本与实业企业均跃跃欲试。但因为没有龙头企业的方案引领和成熟的落地实践&#xff0c;市场呈谨慎观望态势&#xff0c;热度无处安放。 北京金融大数据有限公司&#xff08;以下简称“金融大数据公司”&#xff09;作为市…

动手学深度学习——softmax分类

1. 分类问题 回归与分类的区别&#xff1a; 回归可以用于预测多少的问题&#xff0c; 比如"预测房屋被售出价格"&#xff0c;它是个单值输出。softmax可以用来预测分类问题&#xff0c;例如"某个图片中是猫、鸡还是狗&#xff1f;"&#xff0c;这是一个多…

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

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

Bert基础(二十一)--Bert实战:文本摘要

一、介绍 1.1 文本摘要简介 文本摘要&#xff08;Text Summarization&#xff09;&#xff0c;作为自然语言处理&#xff08;NLP&#xff09;领域的一个分支&#xff0c;其核心目标是从长篇文档中提取关键信息&#xff0c;并生成简短的摘要&#xff0c;以提供对原始内容的高度…

Go语言map

map 概念 在Go语言中&#xff0c;map 是一种内建的数据结构&#xff0c;它提供了一种关联式的存储机制&#xff0c;允许你以键值对的形式存储数据。每个键都是唯一的&#xff0c;并且与一个值相关联。你可以通过键来查找、添加、更新和删除值&#xff0c;这类似于其他编程语言…

MAKEFILE 从易到难

相信一个简单的makefile&#xff0c; 只要用过C语言的都能写出来。 但是如果工程中包含了几十个文件夹&#xff0c; 上万个文件&#xff0c; 那用一般的方式就搞不定了。 在用dpdk 的时候&#xff0c; 会经常修改makefile要适配我们的工程。 最开始也是用dpdk中自带的makefil…

wpf 树形结构

Simplifying the WPF TreeView by Using the ViewModel Pattern - CodeProject 【原创】WPF TreeView带连接线样式的优化&#xff08;WinFrom风格&#xff09; - iDream2016 - 博客园 (cnblogs.com)

Android 音视频播放器 Demo(二)—— 音频解码与音视频同步

音视频编解码系列目录&#xff1a; Android 音视频基础知识 Android 音视频播放器 Demo&#xff08;一&#xff09;—— 视频解码与渲染 Android 音视频播放器 Demo&#xff08;二&#xff09;—— 音频解码与音视频同步 RTMP 直播推流 Demo&#xff08;一&#xff09;—— 项目…

selenium截屏代码

六、截屏应用场景&#xff1a;失败截图&#xff0c;让错误看的更直观方法&#xff1a; driver.get_screenshot_as_file(imgepath)参数&#xff1a;imagepath&#xff1a;为图片要保存的目录地址及文件名称如&#xff1a; 当前目录 ./test.png上一级目录 ../test.png扩展&#x…

Qt+Ubuntu20.04:打包qt

打包程序 参考 qt项目在Linux平台上面发布成可执行程序.run_qt.run不是虚拟机的配置文件-CSDN博客 Linux下Qt程序的打包发布(1)-不使用第三方工具 - 知乎 (zhihu.com) 过程 1、Release编译 先将你的程序在release下编译通过&#xff0c;保证下面打包的程序是你最新的。 2…