网站备案网站名称怎么填/如何推广网址链接

网站备案网站名称怎么填,如何推广网址链接,网站内部结构,旅行社网站建设需求分析学习代理的设计模式的时候,经常碰到的一个经典场景就是想统计某个方法的执行时间。 1 静态代理模式的产生 需求1. 统计方法执行时间 统计方法执行时间,在很多API/性能监控中都有这个需求。 下面以简单的计算器为例子,计算加法耗时。代码如下…

学习代理的设计模式的时候,经常碰到的一个经典场景就是想统计某个方法的执行时间。

1 静态代理模式的产生

需求1. 统计方法执行时间

统计方法执行时间,在很多API/性能监控中都有这个需求。

下面以简单的计算器为例子,计算加法耗时。代码如下:


public Long add(Integer a, Integer b) {long result = 0;for(int i=0; i<100000000; i++) {result += i + a + b;}return result;
}

方法很简单,就是计算两数之和。这里为了方便统计耗时,所以循环了很多次。

统计耗时,那么实现起来也很简单:

public Long add(Integer a, Integer b) {long start = System.currentTimeMillis();long result = 0;for(int i=0; i<100000000; i++) {result += i + a + b;}long end = System.currentTimeMillis();System.out.println("cost time: " + (end - start) + "ms");return result;}

统计代码和业务代码,杂糅在一起,是否是感觉有点混乱,有没有一种方法:在不影响原有业务逻辑情况下实现统计耗时的功能?

需求2.不影响原有业务逻辑,实现方法的耗时统计

很快我们想到一种方法,那就是定义一个父类,专门做耗时统计,业务代码通过抽象方法定义,子类扩展具体的业务方法即可。

代码如下:

public abstract class AbstractTime {public Long tickTock(Integer a, Integer b) {long start = System.currentTimeMillis();long result = calculate(a,b);long end = System.currentTimeMillis();System.out.println("cost time: " + (end - start) + "ms");return result;}protected abstract Long add(Integer a, Integer b);
}

计算加法的耗时统计如下:
 

public class AddTime extends AbstractTime {@Overridepublic Long add(Integer a, Integer b) {long result = 0;for(int i=0; i<100000000; i++) {result += i + a + b;}return result;}public static void main(String[] args){AddTime addTime = new AddTime();addTime.tickTock(1, 2);}
}

很好,实现无侵入式统计方法耗时,完成既定目标。

那么问题又来了,假如我们这个方法还需要继承另外一个类,这个时候怎么办呢?

需求3:使用接口方式,实现无侵入式统计方法耗时

我们先把需要实现的业务逻辑,通过接口的方式封装起来,定义一个接口。

public interface Calculator {Long add(Integer a, Integer b);
}

实现业务接口的方法类:

public class AddCalculator implements Calculator {@Overridepublic Long calculate(Integer a, Integer b) {long result = 0;for(int i=0; i<100000000; i++) {result += i + a + b;}return result;}
}

使用接口,无侵入式实现方法耗时统计的方案就是,设计模式里的经典方案:代理模式。

这里使用代理模式,实现的代理类如下:

public class AddCalculatorProxy implements Calculator {private Calculator calculator;public AddCalculatorProxy(Calculator calculator) {this.calculator = calculator;}@Overridepublic Long calculate(Integer a, Integer b) {long start = System.currentTimeMillis();// 具体的业务逻辑类Long result = calculator.add(a, b);long end = System.currentTimeMillis();System.out.println("cost time: " + (end - start) + "ms");return result;}public static void main(String[] args) {Calculator calculator = new AddCalculator();Calculator proxy = new AddCalculatorProxy(calculator);proxy.add(1, 2);}
}

这就是静态代理模式的推演过程。

2. 静态代理模式是什么

静态代理模式是一种设计模式,用于在不修改目标对象的前提下,通过代理对象来控制对目标对象的访问。以下是关于静态代理模式的详细说明:


2.1. 定义

静态代理模式中,代理类和目标类实现相同的接口,代理类持有目标类的实例,并通过代理类间接调用目标类的方法。代理类可以在方法执行前后添加额外的逻辑。


2.2. 特点

接口:目标类和代理类都实现了同一个接口。
代理类:代理类持有一个目标类的引用,并在其方法中调用目标类的方法。
扩展性:可以在不修改目标类的情况下,通过代理类添加额外的功能(如日志记录、性能监控等)。


2.3. 代码分析

根据上面的例子,以下是对静态代理模式的实现分析:

接口定义

public interface Calculator {Long add(Integer a, Integer b);
}

定义了一个 Calculator 接口,包含一个 add 方法。

目标类:

public class AddCalculator implements Calculator {@Overridepublic Long calculate(Integer a, Integer b) {long result = 0;for(int i=0; i<100000000; i++) {result += i + a + b;}return result;}
}

AddCalculator 是目标类,实现了 Calculator 接口。
提供了具体的业务逻辑(例如计算两个数的和并进行循环累加)。

代理类

public class AddCalculatorProxy implements Calculator {private Calculator calculator;public AddCalculatorProxy(Calculator calculator) {this.calculator = calculator;}@Overridepublic Long calculate(Integer a, Integer b) {long start = System.currentTimeMillis();// 调用目标类的业务逻辑Long result = calculator.add(a, b);long end = System.currentTimeMillis();System.out.println("cost time: " + (end - start) + "ms");return result;}
}

AddCalculatorProxy 是代理类,也实现了 Calculator 接口。
持有一个 Calculator 类型的目标类实例。
在 calculate 方法中,代理类在调用目标类的 add 方法前后添加了时间统计的逻辑。

测试代码

public static void main(String[] args) {Calculator calculator = new AddCalculator();Calculator proxy = new AddCalculatorProxy(calculator);proxy.add(1, 2);
}

创建目标类实例 AddCalculator。
使用代理类 AddCalculatorProxy 包装目标类实例。
调用代理类的 add 方法时,会自动执行代理类中的额外逻辑(如性能统计)。


2.4. 优点

职责分离:将核心业务逻辑与附加功能分离,符合单一职责原则。
增强功能:可以在不修改目标类的情况下,通过代理类添加新的功能。


2.5. 缺点

代码膨胀:每新增一个目标类,就需要创建一个对应的代理类,可能导致代码量增加。
灵活性不足:代理类和目标类必须实现相同的接口,缺乏动态性。


2.6. 总结

静态代理模式适用于需要在目标类的基础上扩展功能的场景。它通过代理类封装目标类的行为,同时保持接口的一致性。例子代码很好地展示了静态代理模式的应用,通过代理类实现了性能监控的功能。

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

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

相关文章

Flutter快速搭建聊天

之前项目中使用的环信聊天&#xff0c;我们的App使用的Flutter开发的 。 所以&#xff0c;就使用的 em_chat_uikit &#xff0c;这个是环信开发的Flutter版本的聊天。 一开始&#xff0c;我们也用的环信的聊天&#xff0c;是收费的&#xff0c;但是&#xff0c;后面就发现&…

Sa-Token

简介 Sa-Token 是一个轻量级 Java 权限认证框架&#xff0c;主要解决&#xff1a;登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 官方文档 常见功能 登录认证 本框架 用户提交 name password 参数&#xff0c;调用登…

基于javaweb的SSM航班机票预订平台系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

JAVA实现动态IP黑名单过滤

一些恶意用户(可能是黑客、爬虫、DDoS 攻击者)可能频繁请求服务器资源&#xff0c;导致资源占用过高。因此需要一定的手段实时阻止可疑或恶意的用户&#xff0c;减少攻击风险。 通过 IP 封禁&#xff0c;可以有效拉黑攻击者&#xff0c;防止资源被滥用&#xff0c;保障合法用户…

开源的CMS建站系统可以随便用吗?有什么需要注意的?

开源CMS建站系统虽然具有许多优点&#xff0c;但并非完全“随便用”。无论选哪个CMS系统&#xff0c;大家在使用的时候&#xff0c;可以尽可能地多注意以下几点&#xff1a; 1、版权问题 了解开源许可证&#xff1a;不同的开源CMS系统采用不同的开源许可证&#xff0c;如GPL、…

故障识别 | 基于改进螂优化算法(MSADBO)优化变分模态提取(VME)结合稀疏最大谐波噪声比解卷积(SMHD)进行故障诊断识别,matlab代码

基于改进螂优化算法&#xff08;MSADBO&#xff09;优化变分模态提取&#xff08;VME&#xff09;结合稀疏最大谐波噪声比解卷积&#xff08;SMHD&#xff09;进行故障诊断识别 一、引言 1.1 机械故障诊断的背景和意义 在工业生产的宏大画卷中&#xff0c;机械设备的稳定运行…

探究 CSS 如何在HTML中工作

2025/3/28 向全栈工程师迈进&#xff01; 一、CSS的作用 简单一句话——美化网页 <p>Lets use:<span>Cascading</span><span>Style</span><span>Sheets</span> </p> 对于如上代码来说&#xff0c;其显示效果如下&#xff1…

硬件老化测试方案的设计误区

硬件老化测试方案设计中的常见误区主要包括测试周期不足、测试条件过于单一、样品选择不当等方面。其中&#xff0c;测试周期不足尤为突出&#xff0c;容易导致潜在缺陷未被完全暴露。老化测试本质上是通过加速产品老化来模拟长期使用状况&#xff0c;因此测试周期不足会严重削…

无锡零碳园区“三年突围”安科瑞源网荷储充系统如何破解“绿电难、储能贵、调度乱”困局?

零碳园区建设如火如荼&#xff0c;为何企业“不敢投、不会用”&#xff1f; 无锡市政府3月27日发布《零碳园区建设三年行动方案》&#xff0c;目标到2027年建成10家以上零碳园区、20家零碳工厂、10个源网荷储一体化项目。但企业仍存疑虑&#xff1a; 绿电消纳难&#xff1a;光…

docker torcherve打包mar包并部署模型

使用Docker打包深度网络模型mar包到服务端 参考链接&#xff1a;Docker torchserve 部署模型流程——以WSL部署YOLO-FaceV2为例_class myhandler(basehandler): def initialize(self,-CSDN博客 1、docker拉取环境镜像命令 docker images出现此提示为没有权限取执行命令&…

kubernetes》》k8s》》 kubeadm、kubectl、kubelet

kubeadm 、kubectl 、kubelet kubeadm、kubectl和kubelet是Kubernetes中不可或缺的三个组件。kubeadm负责集群的快速构建和初始化&#xff0c;为后续的容器部署和管理提供基础&#xff1b;kubectl作为命令行工具&#xff0c;提供了与Kubernetes集群交互的便捷方式&#xff1b;而…

linux 硬盘扩展

场景&#xff1a; [rootlocalhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 40G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 1G 0 part /boot └─sda3 …

Docker Desktop 界面功能介绍

Docker Desktop 界面功能介绍 左侧导航栏 Containers(容器): 用于管理容器,包括查看运行中或已停止的容器,检查容器状态、日志,执行容器内命令,启动、停止、删除容器等操作。Images(镜像): 管理本地 Docker 镜像,可查看镜像列表、从 Docker Hub 拉取新镜像、删除镜…

数据设计(范式、步骤)

文章目录 数据设计1.数据库设计的三大范式2、数据库设计的具体步骤 数据设计 1.数据库设计的三大范式 关系型数据库的三大范式&#xff0c;指导如何设计一个关系型数据库。 1NF&#xff1a; 关系表的每个字段&#xff0c;都应该是不可再分的&#xff0c;——保证原子性。 字…

PhotoShop学习03

1.更改图像大小 通常情况下&#xff0c;如果我们想在某些上传图片&#xff0c;会发现我们的图片可能会过大或者过小&#xff0c;为此&#xff0c;我们需要调整图像的大小&#xff0c;使之符合网站的规则。 首先打开photoshop&#xff0c;打开一张图片。首先我们需要了解这张图…

【区块链安全 | 第二篇】区块链概念详解

文章目录 概述1. 区块链类型2 区块链五层架构3 账本模型4. 节点&#xff08;Node&#xff09;5. 区块&#xff08;Block&#xff09;6. 区块链&#xff08;Blockchain&#xff09;7. 区块链工作流程 核心技术1. 共识机制2. 智能合约 主要组件1. 交易&#xff08;Transaction&am…

Redisson - 分布式锁和同步器

文章目录 锁&#xff08;Lock&#xff09;公平锁&#xff08;Fair Lock&#xff09;联锁&#xff08;MultiLock&#xff09;红锁&#xff08;RedLock&#xff09; 【已废弃】读写锁&#xff08;ReadWriteLock&#xff09;信号量&#xff08;Semaphore&#xff09;可过期许可信号…

HarmonyOS:GridObjectSortComponent(两个Grid之间网格元素交换)

一、概述 网格对象的编辑排序是用于网格对象的编辑、拖动排序、新增和删除。 说明 该组件从API Version 11开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 二、导入模块 import { GridObjectSortComponent, GridObjectSortComponentItem…

智能监控视频聚合平台,GB28181/RTSP/SIP/RTMP直播会议融合方案

全场景智能监控聚合平台&#xff1a;打破边界&#xff0c;赋能高效协同 在数字化转型加速的今天&#xff0c;海量视频监控设备、多样化的编码协议与复杂的业务场景&#xff0c;让企业面临跨系统整合难、资源调度效率低、协作响应慢等痛点。我们的智能监控聚合平台以技术创新为…