【代理模式】静态代理-简单例子

news/2024/9/25 19:16:37/

在Java中,静态代理是一种设计模式,它涉及到为一个对象提供一个代理以控制对这个对象的访问。静态代理在编译时就已经确定,代理类和被代理类会实现相同的接口或者是代理类继承被代理类。客户端通过代理类来访问(调用)被代理类的方法,而代理类可以在调用前后添加一些额外的处理逻辑。

目录

一、目录结构

二、各个部分

三、测试


一、目录结构

二、各个部分

(1)首先定义Rent接口和Host类,并且Host类实现了Rent接口。

java">public interface Rent {public void rent();
}
java">public class Host implements Rent{@Overridepublic void rent() {System.out.println("房东租房");}
}

(2)新建一个Proxy类,Proxy 类包含了对 Host 类的引用,并且实现了租房的相关操作,如 rent() 方法。在 rent() 方法中,除了调用 host.rent() 来完成实际的租房操作外,还添加了额外的行为:see()fare() 方法,分别表示中介带客户看房和收取中介费。

java">public class Proxy {private Host host;public Proxy(){}public Proxy(Host host){this.host = host;}public void rent(){see();host.rent();fare();}public void see(){System.out.println("中介带你看房子");}public void fare(){System.out.println("收中介费");}
}

(3)创建一个Client 类,Client 类是客户端类,表示租房的客户,它使用 Proxy 类(代理类)来访问 Host

java">public class Client {public static void main(String[] args) {Host host = new Host();Proxy proxy = new Proxy(host);  // 代理proxy.rent();}
}

三、测试

运行代码的结果:

在这个例子中,House 类表示待租的房源,Proxy 类是中介服务,Client 类是租房的客户。当客户通过中介租房时,中介会先带客户看房,然后完成租房交易,最后收取中介费。

四、总结

(1)静态代理的好处:

  1. 增强被代理类的功能:代理类可以在不修改被代理类代码的情况下,对被代理类的方法进行增强,例如添加日志记录、事务处理、安全检查等。

  2. 实现客户端与被代理类的解耦:客户端只与代理类交互,降低了客户端与被代理类之间的直接依赖,有利于系统的扩展和维护。

  3. 控制访问:代理类可以控制对被代理类方法的访问,例如限制访问频率、实现权限校验等。

(2)静态代理的缺点:

  1. 代码冗余:如果有很多类需要被代理,那么就需要为每一个类都编写一个对应的代理类,这会导致系统中类的数量增加,代码冗余度高。

  2. 不易维护:当被代理类增加、删除或修改方法时,需要同步更新代理类,增加了维护的复杂性。

  3. 灵活性差:静态代理的模式比较固定,不够灵活,不易于应对频繁变化的业务需求。

  4. 无法代理没有接口的类:在Java中,如果一个类没有实现任何接口,并且被声明为final,那么它就不能被代理(这里指的是静态代理和基于接口的JDK动态代理,但可以通过CGLIB等库实现对类的动态代理)。

(3)为了克服静态代理的缺点,Java提供了动态代理机制,它可以在运行时动态地创建一个代理类,而不需要为每个被代理类手动编写代理代码。动态代理主要依赖于Java的反射机制来实现。

可跳转看我的另一篇博客【代理模式】动态代理-简单例子-CSDN博客


http://www.ppmy.cn/news/1427325.html

相关文章

linux离线安装mysql

一、下载mysql 地址:MySQL 这里选择64为还是32为要根据操作系统来 uname -m 二、上传解压配置mysql 使用root账户登录linux服务器,在opt文件下创建mysql文件夹 cd /opt sudo mkdir mysql 使用Xftp上传mysql压缩包到此文件夹下(自行决定路径) cd mysql/…

计算机网络 -- 多人聊天室

一 程序介绍和核心功能 这是基于 UDP 协议实现的一个网络程序,主要功能是 构建一个多人聊天室,当某个用户发送消息时,其他用户可以立即收到,形成一个群聊。 这个程序由一台服务器和n个客户端组成,服务器扮演了一个接受…

React中Toast 库推荐

react-hot-toast介绍 react-hot-toast是一个为 React 应用打造的轻量级、高度可定制的通知库。它不仅易于使用,而且默认样式美观,能够为 Web应用提供流畅的用户体验。可配置自定义操作,提示框持续时间,文本样式,图表样…

二叉树的层序遍历与深度遍历

二叉树 今天学习并回顾了二叉树,对其基本算法进行了重写。如有可优化的地方,欢迎指正!代码均在Leetcode上跑过了。 层序遍历(Leetcode102题) 由于用前面写算法都是用C语言写的,像栈、队列每次都得手敲一遍。这里为了简化代码&a…

【网站项目】党员之家服务系统小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

OJ:数字三角形(搜索)

🎁个人主页:我们的五年 🔍系列专栏:每日一练 🌷追光的人,终会万丈光芒 🌷1.问题描述: ⛳️题目描述: 示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路…

Beego框架学习

Beego是一个使用Go语言开发的Web应用框架,它以其高效率和易用性而受到开发者的喜爱。以下是学习Beego框架的一些关键点: 了解Beego的特性:Beego框架支持RESTful和MVC模型,提供了一系列的模块功能,可以帮助开发者快速构建Web应用。它还包含一些高级功能,如监控代码修改进行…

椋鸟数据结构笔记#10:排序·中

文章目录 四、归并排序时间复杂度实现递归实现非递归实现 测试稳定性 五、非比较排序5.1 计数排序时间复杂度实现测试局限性 5.2 桶排序时间复杂度实现测试 5.3 基数排序时间复杂度实现测试局限性 萌新的学习笔记,写错了恳请斧正。 四、归并排序 归并排序是一种非常…