在Java中,静态代理是一种设计模式,它涉及到为一个对象提供一个代理以控制对这个对象的访问。静态代理在编译时就已经确定,代理类和被代理类会实现相同的接口或者是代理类继承被代理类。客户端通过代理类来访问(调用)被代理类的方法,而代理类可以在调用前后添加一些额外的处理逻辑。
目录
一、目录结构
二、各个部分
三、测试
一、目录结构
二、各个部分
(1)首先定义Rent接口和Host
类,并且Host
类实现了Rent接口。
public interface Rent {
public void rent();
}
public class Host implements Rent{
@Override
public void rent() {
System.out.println("房东租房");
}
}
(2)新建一个Proxy类,Proxy
类包含了对 Host
类的引用,并且实现了租房的相关操作,如 rent()
方法。在 rent()
方法中,除了调用 host.rent()
来完成实际的租房操作外,还添加了额外的行为:see()
和 fare()
方法,分别表示中介带客户看房和收取中介费。
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
类
public class Client {
public static void main(String[] args) {
Host host = new Host();
Proxy proxy = new Proxy(host); // 代理
proxy.rent();
}
}
三、测试
运行代码的结果:
在这个例子中,House
类表示待租的房源,Proxy
类是中介服务,Client
类是租房的客户。当客户通过中介租房时,中介会先带客户看房,然后完成租房交易,最后收取中介费。
四、总结
(1)静态代理的好处:
-
增强被代理类的功能:代理类可以在不修改被代理类代码的情况下,对被代理类的方法进行增强,例如添加日志记录、事务处理、安全检查等。
-
实现客户端与被代理类的解耦:客户端只与代理类交互,降低了客户端与被代理类之间的直接依赖,有利于系统的扩展和维护。
-
控制访问:代理类可以控制对被代理类方法的访问,例如限制访问频率、实现权限校验等。
(2)静态代理的缺点:
-
代码冗余:如果有很多类需要被代理,那么就需要为每一个类都编写一个对应的代理类,这会导致系统中类的数量增加,代码冗余度高。
-
不易维护:当被代理类增加、删除或修改方法时,需要同步更新代理类,增加了维护的复杂性。
-
灵活性差:静态代理的模式比较固定,不够灵活,不易于应对频繁变化的业务需求。
-
无法代理没有接口的类:在Java中,如果一个类没有实现任何接口,并且被声明为final,那么它就不能被代理(这里指的是静态代理和基于接口的JDK动态代理,但可以通过CGLIB等库实现对类的动态代理)。
(3)为了克服静态代理的缺点,Java提供了动态代理机制,它可以在运行时动态地创建一个代理类,而不需要为每个被代理类手动编写代理代码。动态代理主要依赖于Java的反射机制来实现。
可跳转看我的另一篇博客【代理模式】动态代理-简单例子-CSDN博客