动态代理模式分类
- 基于jdk的动态代理
- 基于cglib的动态代理
- 区别是基于jdk的动态代理要有实现的接口,而cglib不需要
动态代理实现
真实角色——房东
package com.xiaobai.dynamicproxy.jdk3;
public class Landlord implements Rent {
@Override
public void rent() {
System.out.println("我是房东 我房屋租出");
}
}
代理角色——中介
package com.xiaobai.dynamicproxy.jdk3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HousingAgency implements InvocationHandler {
private Rent rent;
public HousingAgency() {
}
public HousingAgency(Rent rent) {
this.rent = rent;
}
private boolean see(){
System.out.println("中介带房客看房,房客觉得可以,就租房,不可以就拜拜");
return true;
}
private boolean contract(){
System.out.println("签合同,如果没有霸王条款则正常签订");
return true;
}
private boolean pay(){
System.out.println("签订完合同交房租");
return true;
}
private String give(){
System.out.println("转交房租给房东");
return "房东已收到钱";
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
see();
contract();
pay();
Object ret = method.invoke(rent, args);
give();
return ret;
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
}
}
出租房屋接口
package com.xiaobai.dynamicproxy.jdk3;
public interface Rent {
public void rent();
}
真实角色——租客
package com.xiaobai.dynamicproxy.jdk3;
public class Tenant {
public static void main(String[] args) {
Rent rent = new Landlord();
HousingAgency housingAgency = new HousingAgency(rent);
Rent rent1 = (Rent) housingAgency.getProxyInstance();
rent1.rent();
}
}
运行结果