1、代理模式
代理模式:为其他对象提供一种代理以控制这个对象的访问。
分析:
- 抽象角色:一般使用接口或者抽象类来解决
- 真实角色:被代理的角色
- 代理角色:可以代理真实角色,拥有真实角色的方法
- 客户:访问代理角色
1.1 静态代理模式
静态代理是由程序或特定工具自动生成的源代码,在程序运行时,.class
文件就已经存在了。
静态代理的好处:
- 使真实角色的操作更加纯粹,代码不用动,不用去关注一些公共业务
- 公共业务交给代理角色!实现业务的分工
- 公共业务扩展也是再代理角色中实现,方便集中管理
真实角色类:
public interface Renti {
void rent();
}
public class Rent implements Renti{
public void rent() {
System.out.println("buy house!----真实对象");
}
}
代理角色类:
public class RentProxy implements Renti{
private Rent rent;
public RentProxy(Rent rent) {
this.rent = rent;
}
public void rent() {
System.out.println("fiex!-----代理对象");
rent.rent();
}
}
测试类(客户):
//静态代理模式:
@Test
public static void main(String[] args) {
Rent rent = new Rent();
RentProxy rentproxy = new RentProxy(rent);
rentproxy.rent();
}
1.2 动态代理模式
动态代理指在运行时自动生成的代理类。
动态代理的好处:
- 使真实角色的操作更加纯粹,代码不用动,不用去关注一些公共业务
- 公共业务交给代理角色!实现业务的分工
- 公共业务扩展也是再代理角色中实现,方便集中管理
- 一个动态代理类代理一个接口,一般是对应的一类业务
- 一个动态代理类可以代理多个类,只要是实现同一个接口就可以
动态代理需要实现InvocationHandler
接口的invoke
方法:
-
创建方法,必须调用Proxy类的静态方法
newProxyInstance
,该方法如下:Object Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) throws IllegalArgumentException
- loder:表示类加载器,通过getClassLoader()获取
- interfaces:表示需要代理的类的接口,通过getInterfaces获取
- handler:表示调用处理器,实现了InvocationHandler接口的对象
-
最后,在重载的invoke方法中,使用method.invoke()方法传参
实体类:
public interface Rent {
void rent();
}
public class RentRel implements Rent{
public void rent() {
System.out.println("buy house!---真实主体!");
}
}
代理类:
public class Proxydy implements InvocationHandler {
//被代理的接口。
private Object object = null;
//生成得到的代理类。
public Object newReal(Object real){
this.object = real;
Class<?> realClass = real.getClass();
Object proxyInstance = Proxy.newProxyInstance(realClass.getClassLoader(),realClass.getInterfaces(),this);
return proxyInstance;
}
//处理代理实例,并返回结果。
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("进入代理!!!!");
//本质:使用反射机制实现动态代理。
Object invoke = method.invoke(object, args);
return invoke;
}
}
测设类:
//动态代理模式:
public static void main(String[] args) {
Rent real = (Rent) new Proxydy().newReal(new RentRel());
real.rent();
}