静态代理 及 示例

静态代理

概念

静态代理,是代理模式的一种实现方式,

它要求代理类被代理类 实现同一个接口,

这样代理类就可以代替被代理类对象对外提供服务,

代理类的方法被调用时,代理类会在调用被代理类方法的前后,添加一些公共的业务逻辑,

例如:日志记录、安全检查、事务管理等


静态代理的缺点

当,被代理的接口,有很多方法时,代理类需要实现所有的方法,并添加相应的代理逻辑,

这会导致代理类非常庞大且难以维护,

此外,每增加一个新的接口,都需要创建一个新的代理类,这也增加了代码的复杂度,

因此,在实际应用中,动态代理(如:JDK动态代理、CGLIB动态代理)往往更加灵活和方便。


静态代理举例

首先,定义一个接口

public interface UserService {  void addUser(String username, String password);void deleteUser(String username);  }

然后,实现被代理类(真实对象),实现UserService接口

public class UserServiceImpl implements UserService {  @Override  public void addUser(String username, String password) {  System.out.println("UserServiceImpl: Adding user with username = " + username);  }  @Override  public void deleteUser(String username) {  System.out.println("UserServiceImpl: Deleting user with username = " + username);  }  }

再然后,创建静态代理类,同样实现UserService接口,并在内部持有被代理类的实例

public class UserServiceProxy implements UserService {  private UserService userService;  public UserServiceProxy(UserService userService) {  this.userService = userService;  }  @Override  public void addUser(String username, String password) {  // 在调用目标方法前添加一些逻辑  System.out.println("UserServiceProxy: Before adding user...");  // 调用目标方法  userService.addUser(username, password);  // 在调用目标方法后添加一些逻辑  System.out.println("UserServiceProxy: After adding user...");  }  @Override  public void deleteUser(String username) {  // 类似地,在调用目标方法前后添加逻辑  System.out.println("UserServiceProxy: Before deleting user...");  userService.deleteUser(username);  System.out.println("UserServiceProxy: After deleting user...");  }  }

最后,在测试类中,通过静态代理类来调用被代理类的方法:


public class Client {  public static void main(String[] args) {  // 创建被代理对象  UserService userService = new UserServiceImpl();  // 创建代理对象,并将被代理对象传递给代理对象  UserService proxy = new UserServiceProxy(userService); // 通过代理对象调用方法  proxy.addUser("Alice", "password123");  proxy.deleteUser("Alice");  }  
}

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

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

相关文章

私有化客服系统:在线客服搭建与部署的创新之路

随着互联网技术的飞速发展,企业与客户之间的沟通方式也在不断地演变。在这个信息爆炸的时代,一个高效、便捷、智能的在线客服系统成为了企业提升服务质量、增强客户满意度的重要工具。本文将详细介绍在线客服系统的构建、部署以及私有化客服的优势&#…

Ant Design Vue

Ant Design Vue是一个由阿里巴巴团队打造的Vue组件库,它以其优雅的设计和丰富的功能集成而被广泛使用。以下是对Ant Design Vue的简单介绍: 首先,Ant Design Vue采用了精良的设计风格,为用户提供了简约、美观的界面,符…

类和对象—初阶

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1 访问限定符 【面试题】 4.2 封装 【面试题】 5.类的作用域 6.类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式 7.3 结构体内存对齐规则 【面试题】…

LMDoply部署实战

使用LMDeoply部署各类开源大模型,进行推理实践。 一. 环境准备 1. 创建Conda环境 studio-conda -t lmdeploy -o pytorch-2.1.2 2. 安装LMDeploy 激活刚刚创建的虚拟环境。 conda activate lmdeploy 安装0.3.0版本的lmdeploy。 pip install lmdeploy[all]0.3.…

Chrome谷歌下载入口

​hello,我是小索奇 发现好多人说谷歌浏览器在哪里下载呀,哪里可以找到? 你可能会心想,一个浏览器你还不会下载啊? 还真是,有很多伙伴找不到下载入口,为什么呢? Bing进行搜索&am…

4.进程相关 2

8.内存映射 8.1 内存映射相关定义 创建一个文件,将保存在磁盘中的文件映射到内存中,后期两个进程之间对内存中的数据进行操作,大大减少了访问磁盘的时间,也是一种最快的 IPC ,因为进程之间可以直接对内存进行存取 8.…

面试经典算法系列之双指针1 -- 合并两个有序数组

面试经典算法题1 – 合并两个有序数组 LeetCode.88 公众号:阿Q技术站 问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#…

【讲解下Fiddler的安装和使用】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

设计模式学习笔记 - 设计模式与范式 -行为型:11.迭代器模式(下):如何设计实现一个支持“快照”功能的Iterator

概述 前两篇文章,学习了迭代器模式的原理、实现,并分析了在遍历集合的同时增删元素集合,产生不可预期结果的原因及应对策略。 本章,再来看这样一个问题: 如何实现一个支持 “快照” 功能的迭代器? 这个问…

【IT资质合集】CMMI软件能力成熟度介绍,一定不要错过!

近几年,IT企业在市场上逐渐增多,很多企业为了能在市场上取得一定的发展,那办理几项企业相关资质是不可缺少的,任何一项资质对于企业来说都是具有一定优势的,同时也会更加利于企业的发展。 企业常办理的IT资质类 ✅ C…

C语言每日一题(67)长度最小的子数组

题目链接 209 长度最小的子数组 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组&#xff0c…

宠物救助系统|基于Springboot和vue的流浪猫狗救助救援系统设计与实现(源码+数据库+文档)

宠物救助目录 基于Springboot和vue的流浪猫狗救助救援系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台: 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌…

面试经典算法系列之链表2 -- 环形链表

面试经典算法8-环形链表 LeetCode.141 公众号:阿Q技术站 问题描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环&am…

flask 后端 + 微信小程序和网页两种前端:调用硬件(相机和录音)和上传至服务器

选择 flask 作为后端,因为后续还需要深度学习模型,python 语言最适配;而 flask 框架轻、学习成本低,所以选 flask 作为后端框架。 微信小程序封装了调用手机硬件的 api,通过它来调用手机的摄像头、录音机,…

【C++成长记】C++入门 |函数重载、引用、内联函数

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:C❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、函数重载 1、函数重载概念 二、引用 1、引用概念 2、引用特性 3、常引用 4、使用场景 5、…

数据库之DCL操作(用户、访问权限。)

DCL英文全称是Data control language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。 1.管理用户 1.1查询用户 select * from mysql.user; 其中 Host代表当前用户访问的主机,如果为localhost,仅代表只能够在当前本机访问&…

Synergy错误: NOTE: Cursor is locked to screen, check Scroll Lock key

错误: NOTE: Cursor is locked to screen, check Scroll Lock key NOTE: Cursor is locked to screen, check Scroll Lock key NOTE: Cursor is locked to screen, check Scroll Lock key NOTE: Cursor is locked to screen, check Scroll Lock key NOTE: Cursor is…

深入浅出 -- 系统架构之微服务中OpenFeign最佳实践

前面我们讲了一下 Ribbon 和 RestTemplate 实现服务端通信的方法,Ribbon 提供了客户端负载均衡,而 RestTemplate 则对 http 进行封装,简化了发送请求的流程,两者互相配合,构建了服务间的高可用通信。 但在使用后也会发…

谁在投资“元素周期表”? 顶级芯片制造商“军备竞赛”

有色和商品基金的大买家何在 投资A股,有时候投资的也是一种“玄妙”的境界。 你需要复习金融知识、复习经济知识,复习科技知识,学习财政学、学习人口学、学习传染病学。 但这些可能还不够。 你能想象么有朝一日,你会回头复习中…

Flask项目如何在测试环境和生产环境部署上线

前言 最近在使用Flask框架,写一个小项目,在项目部署启动后,出现了以下这段提示,这段提示的意思是,该启动方式适用于开发环境中,生产环境要使用WSGI服务器。 WARNING: This is a development server. Do no…