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

Java 静态代理详解:为什么代理类和被代理类要实现同一个接口?

在 Java 开发中,代理模式是一种常用的设计模式,其中代理类的作用是控制对其他对象的访问。代理模式分为静态代理动态代理,在静态代理中,代理类和被代理类都需要实现同一个接口。这一机制为实现透明的代理行为提供了基础,同时确保代理类能够以一致的方式代理被代理类的方法。

本文将深入解析静态代理的工作原理,重点解释为什么代理类和被代理类必须实现相同的接口。


1. 静态代理的基本原理

1.1 代理模式概述

代理模式的核心思想是通过代理对象来控制对目标对象的访问。在静态代理中,开发者手动创建代理类来封装真实对象的行为,并在不修改原有类的前提下,添加额外的功能或行为。

// 定义接口
public interface Service {void performTask();
}// 被代理类实现接口
public class RealService implements Service {@Overridepublic void performTask() {System.out.println("Performing task in RealService");}
}// 代理类也实现同一个接口
public class ProxyService implements Service {private RealService realService;public ProxyService(RealService realService) {this.realService = realService;}@Overridepublic void performTask() {System.out.println("Before performing task");realService.performTask();  // 调用被代理类的方法System.out.println("After performing task");}
}// 使用代理
public class Client {public static void main(String[] args) {RealService realService = new RealService();ProxyService proxyService = new ProxyService(realService);proxyService.performTask();}
}

在这个例子中,Service 是一个接口,RealService 实现了这个接口。ProxyService 同样实现了 Service 接口,并通过组合的方式持有 RealService 的引用。

1.2 静态代理的运行结果

Client 类中,我们通过代理类 ProxyService 来调用被代理类 RealService 的方法,同时代理类在执行任务前后添加了额外的行为。

输出结果如下:

Before performing task
Performing task in RealService
After performing task

2. 为什么代理类和被代理类要实现同一个接口?

在静态代理中,代理类和被代理类必须实现同一个接口,主要有以下几个原因:

2.1 保证接口的一致性

代理类和被代理类实现相同的接口,这意味着代理类可以以完全相同的方式调用被代理类的方法,从而保证了接口的一致性。通过这种设计,客户端可以无差别地使用代理类或被代理类,而不需要知道背后具体是哪个实现类。这使得代码具有更好的解耦性扩展性

// 客户端代码无须修改,既可以使用代理类也可以使用真实类
Service service = new ProxyService(new RealService());
service.performTask();

代理类与被代理类实现相同接口的设计,确保了客户端无需关心具体的类实现,从而提高了代码的灵活性和维护性。

2.2 透明代理

代理模式的核心在于透明性,也就是客户端不应该关心它调用的是代理对象还是实际对象。代理类通过实现相同的接口,保证了在使用代理时,客户端代码不需要做任何修改,依然可以按照接口约定的方式进行调用。代理类仅在内部处理额外逻辑,但对外界而言,代理类和被代理类表现出相同的行为。

2.3 支持面向接口编程

面向接口编程是 Java 设计中的重要原则。通过接口定义契约,能够使得系统更加灵活,容易扩展和维护。代理类和被代理类实现相同的接口,符合面向接口编程的思想。它允许开发者对类进行封装,同时保持接口的稳定性,从而减少了修改类时对系统其他部分的影响。

public class AnotherClient {private Service service;// 可以依赖接口而不是具体类public AnotherClient(Service service) {this.service = service;}public void executeTask() {service.performTask();}
}

在这种设计中,AnotherClient 类只依赖 Service 接口,而不关心具体是 RealService 还是 ProxyService,这极大提高了代码的灵活性。

2.4 便于增强功能的扩展

通过代理类实现相同的接口,开发者可以轻松地在代理类中增强现有的功能。例如,在上面的例子中,代理类 ProxyService 可以在调用被代理类方法前后添加日志、权限检查或事务管理等逻辑。这些扩展功能可以不改变被代理类的代码,便于系统的扩展和维护。

@Override
public void performTask() {log("Before task");realService.performTask();  // 调用原始功能log("After task");
}private void log(String message) {System.out.println(message);
}

3. 静态代理的优缺点

优点:
  1. 解耦性强:代理类和被代理类分离,遵循了单一职责原则。代理类可以专注于为业务添加额外的功能,如日志、监控等。
  2. 透明性:代理类与被代理类实现相同的接口,保证了客户端可以透明地使用代理,增强了代码的灵活性。
缺点:
  1. 代码重复:如果接口有很多方法,代理类必须逐个实现这些方法,这会带来重复代码,增加维护成本。
  2. 不灵活:每个代理类只能代理一个特定的接口或类,无法动态地根据需求代理多个不同的类。

4. 总结

在 Java 静态代理模式中,代理类和被代理类必须实现同一个接口,原因在于:

  • 保证接口的一致性,确保客户端可以无差别地调用代理类或被代理类。
  • 使得代理过程对客户端透明,符合面向接口编程的设计原则。
  • 通过这种设计,代理类能够在不修改被代理类的情况下,扩展额外的功能,提升了代码的灵活性和可维护性。

尽管静态代理有一定的局限性,如代码重复,但它仍然是 Java 中一种非常有用的设计模式,尤其在某些需要预先定义行为的场景中非常适用。了解代理模式的工作原理并理解其背后的设计思想,有助于我们编写出更加灵活和可扩展的代码。

相关文章:

Java 静态代理详解:为什么代理类和被代理类要实现同一个接口?

在 Java 开发中,代理模式是一种常用的设计模式,其中代理类的作用是控制对其他对象的访问。代理模式分为静态代理和动态代理,在静态代理中,代理类和被代理类都需要实现同一个接口。这一机制为实现透明的代理行为提供了基础&#xf…...

OpenCV C++霍夫圆查找

OpenCV 中的霍夫圆检测基于 霍夫变换 (Hough Transform),它是一种从边缘图像中识别几何形状的算法。霍夫圆检测是专门用于检测图像中的圆形形状的。它通过将图像中的每个像素映射到可能的圆参数空间,来确定哪些像素符合圆形状。 1. 霍夫变换的原理 霍夫…...

H.264编解码介绍

一、简介 H.264,又称为AVC(Advanced Video Coding),是一种广泛使用的视频压缩标准。它由国际电信联盟(ITU)和国际标准化组织(ISO)联合开发,并于2003年发布。 H.264的发展历史可以追溯到上个世纪90年代。当时,视频压缩技术的主要标准是MPEG-2,但它在压缩率和视频质…...

Java | Leetcode Java题解之第450题删除二叉搜索树中的节点

题目: 题解: class Solution {public TreeNode deleteNode(TreeNode root, int key) {TreeNode cur root, curParent null;while (cur ! null && cur.val ! key) {curParent cur;if (cur.val > key) {cur cur.left;} else {cur cur.rig…...

【CViT】Deepfake Video Detection Using Convolutional Vision Transformer

文章目录 Deepfake Video Detection Using Convolutional Vision Transformerkey points**卷积视觉变压器**FLViT实验总结Deepfake Video Detection Using Convolutional Vision Transformer 会议/期刊:2021 作者: key points 提出了一种用于检测深度伪造的卷积视觉变压器…...

安卓主板_MTK4G/5G音视频记录仪整机及方案定制

音视频记录仪方案,采用联发科MT6877平台八核2* A78 6* A55主频高达2.4GHz, 具有高能低耗特性,搭载Android 12.0智能操作系统,可选4GB32GB/6GB128GB内存,运行流畅。主板集成NFC、双摄像头、防抖以及多种无线数据连接,支…...

Qt 教程全集目录公布(方便查阅)

点击上方"蓝字"关注我们 Qt 安装 以下是常见安装方法和软件获取 Qt4Qt5Qt6版本下载(在线和离线)【网址】...

云计算SLA响应时间的matlab模拟与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 用matlab模拟,一个排队理论。输入一堆包,经过buffer(一个或者几个都行)传给server,这些包会在buffer里…...

ARTS Week 42

Algorithm 本周的算法题为 2283. 判断一个数的数字计数是否等于数位的值 给你一个下标从 0 开始长度为 n 的字符串 num &#xff0c;它只包含数字。 如果对于 每个 0 < i < n 的下标 i &#xff0c;都满足数位 i 在 num 中出现了 num[i]次&#xff0c;那么请你返回 true …...

10.2学习

1.IOC控制反转 IoC&#xff08;Inverse of Control:控制反转&#xff09;是⼀种设计思想&#xff0c;就是将原本在程序中⼿动创建对象的控制权&#xff0c;交由Spring框架来管理。 IoC 在其他语⾔中也有应⽤&#xff0c;并⾮ Spring 特有。 ​ IoC 容器是 Spring⽤来实现 IoC …...

【数一线性代数】021入门

Index 推荐阅读&#xff1a;https://blog.csdn.net/weixin_60702024/article/details/141729949分析实现总结 推荐阅读&#xff1a;https://blog.csdn.net/weixin_60702024/article/details/141729949 给定二叉树的根节点root&#xff0c;计算其叶节点的个数。 分析实现 类似…...

(k8s)kubernetes中ConfigMap和Secret

转载&#xff1a;ConfigMap 一、ConfigMap介绍 ConfigMap是一种API对象&#xff0c;用来将非机密性的数据保存到键值对中。使用时&#xff0c;Pod可以将其用作环境变量、命令行参数或存储卷中的配置文件。 ConfigMap将你的环境配置信息和容器镜像解耦&#xff0c;便于应用配置…...

stm32四足机器人(标准库)

项目技术要求 PWM波形的学习 参考文章stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)_ttl pwm 驱动激光头区别-CSDN博客 舵机的学习 参考文章 stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)…...

基于Hive和Hadoop的共享单车分析系统

本项目是一个基于大数据技术的共享单车分析系统&#xff0c;旨在为用户提供全面的单车使用信息和深入的出行行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 S…...

基于SSM和vue的机票订购管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM和vue的机票订购管理系统2拥有两种角色 管理员&#xff1a;用户管理、机票管理、订票管理、公告管理、广告管理、系统管理、添加机票等 用户&#xff1a;登录注册、订票、查看公…...

【rCore OS 开源操作系统】Rust 练习题题解: Enums

【rCore OS 开源操作系统】Rust 练习题题解: Enums 摘要 rCore OS 开源操作系统训练营学习中的代码练习部分。 在此记录下自己学习过程中的产物&#xff0c;以便于日后更有“收获感”。 后续还会继续完成其他章节的练习题题解。 正文 enums1 题目 // enums1.rs // // No hi…...

VPN简述

文章目录 VPNVPN基础VPN类型 VPN VPN隧道安全 VPN基础 背景&#xff1a; 在网络传输中&#xff0c;绝大部分数据内容都是明文传输&#xff0c;存在很多安全隐患&#xff08;窃听、篡改、冒充&#xff09; 总部、分公司、办事处、出差人员、合作单位等需要访问总部网络资源 Vi…...

【Kubernetes】常见面试题汇总(四十九)

目录 110.假设一家公司希望通过采用新技术来优化其工作负载的分配。公司如何有效地实现这种资源分配&#xff1f; 111.考虑一家拼车公司希望通过同时扩展其平台来增加服务器数量。您认为公司将如何处理服务器及其安装&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【…...

常见排序算法以及冒泡排序的基础使用方法

众所周知&#xff0c;冒泡排序是编程中最经典也是最简单的一种排序方法&#xff0c;它是通过重复访问对两个相邻的值进行比较&#xff0c;由于在互换的过程中&#xff0c;最大 (或最小) 的那个值会慢慢的交换到顶部&#xff0c;像汽水一样&#xff0c;故名“冒泡排序”。 let a…...

【网络安全】Cookie与ID未强绑定导致账户接管

未经许可,不得转载。 文章目录 前言正文前言 DigiLocker 是一项在线服务,旨在为公民提供一个安全的数字平台,用于存储和访问重要的文档,如 Aadhaar 卡、PAN 卡和成绩单等。DigiLocker 通过多因素身份验证(MFA)来保护用户账户安全,通常包括 6 位数的安全 PIN 和一次性密…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...