设计模式再探——代理模式
目录
- 一、背景介绍
- 二、思路&方案
- 三、过程
- 1.代理模式简介
- 2.代理模式的类图
- 3.代理模式代码
- 4.代理模式还可以优化的地方
- 5.代理模式的项目实战,优化后(只加了泛型方式,使用CGLIB的代理)
- 四、总结
- 五、升华
一、背景介绍
最近在做产品过程中对于日志的统一收集做了深入的研究,最终映射到代理模式的运用上了,通过对代理模式的再探,对代理模式的敬畏又进行了一层升华。
二、思路&方案
- 1.代理模式简介
- 2.代理模式的类图
- 3.代理模式代码
- 4.代理模式还可以优化的地方
- 5.代理模式的项目实战,优化后
三、过程
1.代理模式简介
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问
2.代理模式的类图

3.代理模式代码
package com.a7DesignPattern.a2StructuralType.a07Proxy;/*** 功能描述:** @Author:makang* @Date: 2021/5/22 10:02*/
public abstract class Subject {public abstract void Request();
}
package com.a7DesignPattern.a2StructuralType.a07Proxy;/*** 功能描述:** @Author:makang* @Date: 2021/5/22 10:03*/
public class RealSubject extends Subject{@Overridepublic void Request() {System.out.println("真实对象");}
}
package com.a7DesignPattern.a2StructuralType.a07Proxy;/*** 功能描述:** @Author:makang* @Date: 2021/5/22 10:04*/
public class Proxy extends Subject{private RealSubject realSubject;@Overridepublic void Request() {if(realSubject == null){realSubject = new RealSubject();}realSubject.Request();}
}
package com.a7DesignPattern.a2StructuralType.a07Proxy;/*** 功能描述:** @Author:makang* @Date: 2021/5/22 10:06*/
public class Client {public static void main(String[] args) {Subject subject = new Proxy();subject.Request();}
}
4.代理模式还可以优化的地方
- 1.通过代理类中使用泛型,将被代理对象延迟到运行时定义。
- 2.通过自定义注解或者包扫描的方式,将使用端进行一步优化
5.代理模式的项目实战,优化后(只加了泛型方式,使用CGLIB的代理)
package com.b0032AOP例子_CGLIB动态代理.V1基础例子;public class Calimpl{public int add(int num1, int num2) {return num1 + num2;}public int sub(int num1, int num2) {return num1 - num2;}public int mul(int num1, int num2) {return num1 * num2;}public int div(int num1, int num2) {return num1 / num2;}}
package com.b0032AOP例子_CGLIB动态代理.V1基础例子;import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;
import java.util.Arrays;public class MyMethodInterceptor<T> implements MethodInterceptor {public T getBind(Class<?> object){Enhancer enhancer = new Enhancer();enhancer.setSuperclass(object);enhancer.setCallback(new MyMethodInterceptor());return (T)enhancer.create();}@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println(method.getName() + "方法的参数是"+ Arrays.toString(objects));Object result = methodProxy.invokeSuper(o,objects);System.out.println(method.getName()+"方法的结果是"+result);return result;}
}
package com.b0032AOP例子_CGLIB动态代理.V1基础例子;public class Client {public static void main(String[] args) {MyMethodInterceptor<Calimpl> myMethodInterceptor = new MyMethodInterceptor();Calimpl calimplProxy = myMethodInterceptor.getBind(Calimpl.class);calimplProxy.add(1,1);calimplProxy.sub(2,2);calimplProxy.mul(3,3);calimplProxy.div(4,4);}
}
四、总结
- 1.代理模式的思想,通过将行为的抽象在运行时进行动态干预使得复用性、灵活性都做到了极大的提高
- 2.将单纯的代理模式通过和泛型的结合,使得灵活性再次提升
- 3.后续还可以通过自定义注解,或者包扫描的方式;进一步优化使用端
五、升华
当你的认知提升一个等级之后,再回头看经历过的知识,将会获得不一样的认识
相关文章:
设计模式再探——代理模式
目录 一、背景介绍二、思路&方案三、过程1.代理模式简介2.代理模式的类图3.代理模式代码4.代理模式还可以优化的地方5.代理模式的项目实战,优化后(只加了泛型方式,使用CGLIB的代理) 四、总结五、升华 一、背景介绍 最近在做产品过程中对于日志的统一…...
MySQL日志——查询日志
1.查询日志 show variables like %general%;修改mysql的配置文件 /etc/my.cnf文件,添加如下内容: #该选项用来开启查询日志,可选值:0或者1;0代表关闭,1代表开启 general_log1 #设置日志的文件名࿰…...
Java版本工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em
工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...
pytorch的CrossEntropyLoss交叉熵损失函数默认是平均值
pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的,即多个样本输入后获取的是一个均值标量,而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…...
【力扣】206. 反转链表 <链表指针>
【力扣】206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2 输入:head [1,2] 输出:[2,1] 示例 3 输入:…...
Java包装类(自动拆装箱)
包装类 为什么要有包装类? 在面向对象中,“一切皆为对象”,但是基本数据类型不符合这一理念,为了让基本类型也称为对象 便于类型之间的转化,数据类型之间的基本操作 转换方式: int ——> Integer ne…...
使用Golang反射技术实现一套有默认值的配置解析库
在实际开发中,我们往往会给一个逻辑设计一套配置文件,用于根据不同环境加载不同配置。 比如生产环境和测试环境数据库的地址不一样,我们就需要在配置文件中设置不同的值。但是配置文件中又有一些相同值的配置项,比如数据库的名称等…...
数据安全能力框架模型-详细解读(二)
数据安全能力框架构成 1) 数据安全治理 管理视角:从组织制度流程上提出要求,由于数据在各业务系统之间流转,需要设立高级管理层参与决策的数据安全管理部门,统筹和规划多部门之间的工作;需要设立跨组织的…...
【BASH】回顾与知识点梳理(八)
【BASH】回顾与知识点梳理 八 八. 正则表达式(正规表示法)8.1 什么是正规表示法8.2 基础正规表示法语系对正规表示法的影响grep 的一些进阶选项基础正规表示法练习例题一、搜寻特定字符串例题二、利用中括号 [] 来搜寻集合字符例题三、行首与行尾字符 ^ …...
rust报错“Utf8Error { valid_up_to: 1, error_len: Some(1) } }”
这个错误通常表示在尝试将字节序列解码为UTF-8字符时出现问题。它指出在索引1处发现了无效的字节序列,并且错误的长度为1个字节。 要解决这个问题,你可以尝试以下几种方法: 检查你的输入数据是否包含无效的字节序列。你可以使用一些调试工具…...
【Linux】节点之间配置免密登录
文章目录 1、实现2、原理3、SSH的理解 1、实现 先写实现,解决问题后有兴趣的自己看后面的原理。 以实现节点A(主)免密登录到节点B(从)为例:(注意例子里节点B被登录) 步骤一…...
【13】STM32·HAL库-正点原子SYSTEM文件夹 | SysTick工作原理、寄存器介绍 | printf函数使用、重定向
目录 1.sys文件夹介绍(掌握)2.deley文件夹介绍(掌握)2.1deley文件夹函数简介2.2SysTick工作原理2.3SysTick寄存器介绍2.4delay_init()函数(F1)2.5delay_us()函数(F1)2.6delay_ms()函…...
ansible配置文件案例
案例一 控制主机上的普通用户控制受控主机 控制端1台,受控端两台 1.将两台受控主机添加到/etc/hosts文件中 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhos…...
【大数据】Flink 从入门到实践(一):初步介绍
Flink 从入门到实践(一):初步介绍 Apache Flink 是一个框架和分布式处理引擎,用于在 无边界 和 有边界 数据流上进行 有状态 的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。 1.架构 1…...
大数据课程F4——HIve的其他操作
文章作者邮箱:yugongshiyesina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握HIve的join; ⚪ 掌握HIve的查询和排序 ⚪ 掌握HIve的beeline ⚪ 掌握HIve的文件格式 ⚪ 掌握HIve的基本架构 ⚪ 掌握HIve的优化; 一、jo…...
React Native详解和代码实例
目录 一、React Native 的主要特点二、React Native 的工作原理三、React Native 的优缺点四、React Native 代码示例 React Native 是一个用于构建原生移动应用程序的 JavaScript 框架。它使用 React 库,允许开发者使用 JavaScript 编写应用程序的 UI 和逻辑&#…...
CAD随机球体颗粒过渡区3D插件
插件介绍 CAD随机球体颗粒&过渡区3D插件可用于在AutoCAD软件内生成随机分布的球体及球体外侧过渡区部件,适用于科研绘图、有限元建模如混凝土细观、颗粒增强复合材料、随机三维骨料及过渡区等方面的应用。 插件可指定的参数有模型的长、宽、高;球…...
【项目 进程12】2.25 sigprocmask函数使用 2.26sigaction信号捕捉函数 2.27SIGCHILD信号
文章目录 2.25 sigprocmask函数使用2.26 sigaction信号捕捉函数内核实现信号捕捉的过程信号捕捉特性 2.27SIGCHILD信号 2.25 sigprocmask函数使用 阻塞信号集有时称作信号掩码。 联想:fcntl函数可以修改fd属性。 ./sigprocmask & //将程序设置为后台运行&…...
【无标题】面试题 02.07. 链表相交
面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 方法一:遍历headA,将每个节点add到HashSet中;然后遍历headB…...
Zotero ubuntu2023安装 关联 ubuntu文献翻译
一、准备下载的软件: Zotero | Downloads 1. Zotero-6.0.26_linux-x86_64.tar.bz2 下面是插件 zotfile-5.1.2-fx.xpi zotero-pdf-translate.xpi jasminum-v0.2.6.xpi 2.2.5 Tampermonkey 4.11.crx 所准备的文件,都已经在这个链接的压缩包下面 …...
告别NeRF漫长等待:手把手教你用3D Gaussian Splatting实现实时高保真渲染
告别NeRF漫长等待:手把手教你用3D Gaussian Splatting实现实时高保真渲染 在数字内容创作和计算机视觉领域,高质量3D场景重建一直是个热门话题。传统方法如NeRF(神经辐射场)虽然能生成令人惊艳的结果,但其漫长的训练和…...
华为HCIP-Datacom备考全攻略:从零基础到高分通关的5个关键步骤
华为HCIP-Datacom零基础通关指南:5步构建高效备考体系 站在数据中心网络技术的职业分水岭上,华为HCIP-Datacom认证已成为众多网络工程师突破职业瓶颈的黄金通行证。不同于普通的技术认证,这套体系不仅考察理论知识记忆,更注重解决…...
胡桃工具箱完整使用指南:免费开源原神Windows桌面助手终极教程
胡桃工具箱完整使用指南:免费开源原神Windows桌面助手终极教程 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Trending/sn/…...
如何快速掌握暗黑破坏神2存档编辑:新手的完整可视化指南
如何快速掌握暗黑破坏神2存档编辑:新手的完整可视化指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为修改暗黑2存档而烦恼吗?d2s-editor是一款基于Web的开源暗黑破坏神2存档编辑器,将…...
OCR训练成本直降73%!2026奇点大会披露“渐进式伪标签闭环”框架(含GitHub可运行代码)
第一章:OCR训练成本直降73%!2026奇点大会核心成果概览 2026奇点智能技术大会(https://ml-summit.org) 本届奇点大会首次公开发布轻量级OCR联合蒸馏框架DocDistill-26,通过多粒度教师模型协同调度与动态分辨率感知训练策略,在保持…...
VideoDownloadHelper视频下载助手:如何轻松保存网页视频的完整指南
VideoDownloadHelper视频下载助手:如何轻松保存网页视频的完整指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经遇到…...
告别printf调试!用Telink EVK实时监控BLE芯片变量(8258/8255实战示例)
告别printf调试!用Telink EVK实时监控BLE芯片变量(8258/8255实战示例) 调试嵌入式系统时,开发者常陷入两难:既需要观察程序运行时的内部状态,又受限于传统调试方法的低效。在BLE低功耗场景下,这…...
城通网盘直连解析工具终极指南:3大技术突破实现高速下载
城通网盘直连解析工具终极指南:3大技术突破实现高速下载 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾经面对城通网盘的龟速下载而束手无策?每次下载文件都要经历漫长…...
实战指南:Video DownloadHelper配套应用完整安装与配置方案
实战指南:Video DownloadHelper配套应用完整安装与配置方案 【免费下载链接】vdhcoapp Companion application for Video DownloadHelper browser add-on 项目地址: https://gitcode.com/gh_mirrors/vd/vdhcoapp Video DownloadHelper配套应用(Vd…...
10个jQuery Form性能监控技巧:如何精确测量表单提交性能指标
10个jQuery Form性能监控技巧:如何精确测量表单提交性能指标 【免费下载链接】form jQuery Form Plugin 项目地址: https://gitcode.com/gh_mirrors/fo/form jQuery Form Plugin(src/jquery.form.js)是一款轻量级的表单处理工具&#…...
