当前位置: 首页 > news >正文

设计模式再探——代理模式

目录

  • 一、背景介绍
  • 二、思路&方案
  • 三、过程
    • 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.代理模式的项目实战&#xff0c;优化后(只加了泛型方式&#xff0c;使用CGLIB的代理) 四、总结五、升华 一、背景介绍 最近在做产品过程中对于日志的统一…...

MySQL日志——查询日志

1.查询日志 show variables like %general%;修改mysql的配置文件 /etc/my.cnf文件&#xff0c;添加如下内容&#xff1a; #该选项用来开启查询日志&#xff0c;可选值&#xff1a;0或者1&#xff1b;0代表关闭&#xff0c;1代表开启 general_log1 #设置日志的文件名&#xff0…...

Java版本工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...

pytorch的CrossEntropyLoss交叉熵损失函数默认是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的&#xff0c;即多个样本输入后获取的是一个均值标量&#xff0c;而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…...

【力扣】206. 反转链表 <链表指针>

【力扣】206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3 输入&#xff1a…...

Java包装类(自动拆装箱)

包装类 为什么要有包装类&#xff1f; 在面向对象中&#xff0c;“一切皆为对象”&#xff0c;但是基本数据类型不符合这一理念&#xff0c;为了让基本类型也称为对象 便于类型之间的转化&#xff0c;数据类型之间的基本操作 转换方式&#xff1a; int ——> Integer ne…...

使用Golang反射技术实现一套有默认值的配置解析库

在实际开发中&#xff0c;我们往往会给一个逻辑设计一套配置文件&#xff0c;用于根据不同环境加载不同配置。 比如生产环境和测试环境数据库的地址不一样&#xff0c;我们就需要在配置文件中设置不同的值。但是配置文件中又有一些相同值的配置项&#xff0c;比如数据库的名称等…...

数据安全能力框架模型-详细解读(二)

数据安全能力框架构成 1&#xff09; 数据安全治理 管理视角&#xff1a;从组织制度流程上提出要求&#xff0c;由于数据在各业务系统之间流转&#xff0c;需要设立高级管理层参与决策的数据安全管理部门&#xff0c;统筹和规划多部门之间的工作&#xff1b;需要设立跨组织的…...

【BASH】回顾与知识点梳理(八)

【BASH】回顾与知识点梳理 八 八. 正则表达式&#xff08;正规表示法&#xff09;8.1 什么是正规表示法8.2 基础正规表示法语系对正规表示法的影响grep 的一些进阶选项基础正规表示法练习例题一、搜寻特定字符串例题二、利用中括号 [] 来搜寻集合字符例题三、行首与行尾字符 ^ …...

rust报错“Utf8Error { valid_up_to: 1, error_len: Some(1) } }”

这个错误通常表示在尝试将字节序列解码为UTF-8字符时出现问题。它指出在索引1处发现了无效的字节序列&#xff0c;并且错误的长度为1个字节。 要解决这个问题&#xff0c;你可以尝试以下几种方法&#xff1a; 检查你的输入数据是否包含无效的字节序列。你可以使用一些调试工具…...

【Linux】节点之间配置免密登录

文章目录 1、实现2、原理3、SSH的理解 1、实现 先写实现&#xff0c;解决问题后有兴趣的自己看后面的原理。 以实现节点A&#xff08;主&#xff09;免密登录到节点B&#xff08;从&#xff09;为例&#xff1a;&#xff08;注意例子里节点B被登录&#xff09; 步骤一&#xf…...

【13】STM32·HAL库-正点原子SYSTEM文件夹 | SysTick工作原理、寄存器介绍 | printf函数使用、重定向

目录 1.sys文件夹介绍&#xff08;掌握&#xff09;2.deley文件夹介绍&#xff08;掌握&#xff09;2.1deley文件夹函数简介2.2SysTick工作原理2.3SysTick寄存器介绍2.4delay_init()函数&#xff08;F1&#xff09;2.5delay_us()函数&#xff08;F1&#xff09;2.6delay_ms()函…...

ansible配置文件案例

案例一 控制主机上的普通用户控制受控主机 控制端1台&#xff0c;受控端两台 1.将两台受控主机添加到/etc/hosts文件中 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhos…...

【大数据】Flink 从入门到实践(一):初步介绍

Flink 从入门到实践&#xff08;一&#xff09;&#xff1a;初步介绍 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在 无边界 和 有边界 数据流上进行 有状态 的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 1.架构 1…...

大数据课程F4——HIve的其他操作

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握HIve的join&#xff1b; ⚪ 掌握HIve的查询和排序 ⚪ 掌握HIve的beeline ⚪ 掌握HIve的文件格式 ⚪ 掌握HIve的基本架构 ⚪ 掌握HIve的优化&#xff1b; 一、jo…...

React Native详解和代码实例

目录 一、React Native 的主要特点二、React Native 的工作原理三、React Native 的优缺点四、React Native 代码示例 React Native 是一个用于构建原生移动应用程序的 JavaScript 框架。它使用 React 库&#xff0c;允许开发者使用 JavaScript 编写应用程序的 UI 和逻辑&#…...

CAD随机球体颗粒过渡区3D插件

插件介绍 CAD随机球体颗粒&过渡区3D插件可用于在AutoCAD软件内生成随机分布的球体及球体外侧过渡区部件&#xff0c;适用于科研绘图、有限元建模如混凝土细观、颗粒增强复合材料、随机三维骨料及过渡区等方面的应用。 插件可指定的参数有模型的长、宽、高&#xff1b;球…...

【项目 进程12】2.25 sigprocmask函数使用 2.26sigaction信号捕捉函数 2.27SIGCHILD信号

文章目录 2.25 sigprocmask函数使用2.26 sigaction信号捕捉函数内核实现信号捕捉的过程信号捕捉特性 2.27SIGCHILD信号 2.25 sigprocmask函数使用 阻塞信号集有时称作信号掩码。 联想&#xff1a;fcntl函数可以修改fd属性。 ./sigprocmask & //将程序设置为后台运行&…...

【无标题】面试题 02.07. 链表相交

面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 方法一&#xff1a;遍历headA&#xff0c;将每个节点add到HashSet中&#xff1b;然后遍历headB&#xf…...

Zotero ubuntu2023安装 关联 ubuntu文献翻译

一、准备下载的软件&#xff1a; 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 所准备的文件&#xff0c;都已经在这个链接的压缩包下面 …...

【大模型】LoRA微调实战指南:从原理到落地应用

1. LoRA微调技术&#xff1a;为什么它成为大模型优化的新宠&#xff1f; 第一次接触LoRA微调是在去年优化客服对话系统时。当时我们用GPT-3处理专业领域咨询&#xff0c;发现直接使用基础模型会出现大量行业术语理解错误。传统全参数微调需要40GB显存&#xff0c;而我们的显卡只…...

ADS RFPro实战:用场分布图揪出微带线滤波器800MHz的‘电流热点’

ADS RFPro实战&#xff1a;微带线滤波器800MHz电流热点定位与优化策略 微带线滤波器设计过程中&#xff0c;仿真曲线与实测性能的差异常常困扰着射频工程师。当S参数显示800MHz频点出现异常插损或回波损耗时&#xff0c;传统调试方法往往像在黑暗中摸索。而ADS RFPro的场分布可…...

低查重AI教材编写攻略,掌握这些工具,轻松完成教材创作

教材的初步版本终于完成&#xff0c;但进入修改和优化阶段后&#xff0c;我才意识到这是一种“煎熬”&#xff01;为了通读全文、查找逻辑上的漏洞和知识点的错误&#xff0c;我费了不少时间&#xff1b;重新调整一个章节的结构&#xff0c;往往会影响到后面的多个部分&#xf…...

2025网盘直链下载神器:八大平台高速下载完整指南

2025网盘直链下载神器&#xff1a;八大平台高速下载完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 …...

高斯分布与拉普拉斯分布:从数学原理到Python实战

1. 高斯分布与拉普拉斯分布的核心数学原理 我第一次接触高斯分布是在大学物理实验课上&#xff0c;教授用它来描述测量误差。当时觉得这个"钟形曲线"特别神奇&#xff0c;后来才发现它无处不在——从考试成绩分布到股票价格波动。而拉普拉斯分布则是在研究金融数据时…...

如何用G-Helper彻底告别华硕笔记本的臃肿控制中心?

如何用G-Helper彻底告别华硕笔记本的臃肿控制中心&#xff1f; 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar,…...

3分钟学会Ofd2Pdf:终极免费OFD转PDF解决方案指南

3分钟学会Ofd2Pdf&#xff1a;终极免费OFD转PDF解决方案指南 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf Ofd2Pdf是一款专为中国用户设计的开源工具&#xff0c;能够快速、无损地将OFD格式电子文档…...

bge-large-zh-v1.5应用场景:政府公文语义归档、教育题库向量化管理

bge-large-zh-v1.5应用场景&#xff1a;政府公文语义归档、教育题库向量化管理 1. 引言&#xff1a;当海量文档遇上智能检索 想象一下&#xff0c;你是一位政府工作人员&#xff0c;每天需要从堆积如山的政策文件、会议纪要、历史公文中&#xff0c;快速找到十年前关于“老旧…...

WiFiAnalyzer深度解析:Android上不可或缺的Wi-Fi网络优化利器

1. WiFiAnalyzer&#xff1a;你的无线网络诊断专家 每次刷视频卡顿、游戏延迟飙升时&#xff0c;你是不是也对着路由器咬牙切齿&#xff1f;作为一款专为Android设计的开源工具&#xff0c;WiFiAnalyzer就像给手机装上了X光机&#xff0c;能透视周围所有Wi-Fi信号的"身体状…...

新手友好!零成本体验Allegro自动化:YepStudy V2.0学习版安装与免费功能全指南

新手零成本玩转Allegro自动化&#xff1a;YepStudy V2.0学习版实战手册 刚接触Cadence Allegro的工程师常会陷入两难&#xff1a;这个业界标准的PCB设计工具功能强大&#xff0c;但操作复杂得像在驾驶航天飞机。传统学习路径往往需要投入数月时间熟悉基础操作&#xff0c;而自动…...