代理模式的概念
定义
代理模式是为某个对象提供一个代理对象,并且由代理对象控制对原来对象的访问.
所有的角色
- Subject 抽象类
- RealSubject 具体的实现类
- Proxy 代理类 与真实的业务代码接触
代理的模式
静态代理
抽象的接口类
public interface House {
void rentHouse();
}
真正被调用,去实现具体操作的类
public class Landlord implements House{
@Override
public void rentHouse() {
System.out.println("要出租房");
}
}
代理类
public class Proxy implements House{
private Landlord landlord;
public Proxy(Landlord landlord){
this.landlord = landlord;
}
@Override
public void rentHouse() {
System.out.println("带你去看房");
landlord.rentHouse();
System.out.println("收费了");
}
}
main 方法
public static void main(String[] args) throws CloneNotSupportedException {
Proxy proxy = new Proxy(new Landlord());
proxy.rentHouse();
}
执行结果
带你去看房
要出租房
收费了
这就是静态代理的全过程.
代理类和真实的类都要去实现抽象的类,这种静态代理很好理解,但是因为他全部都是事先写好的,假如在有其他的功能加入,那么这个代理类就要修改了,违背了开闭原则
动态代理
JDK动态代理
修改一下上面的 Proxy 类名为ProxyNew 防止重名
public class ProxyNew {
private Object object;
public ProxyNew(Object object){
this.object = object;
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), (Object proxy, Method method, Object[] args)->{
System.out.println("动态代理执行开始");
Object invoke = method.invoke(object, args);// 反射执行
System.out.println("动态代理执行开始结束");
return invoke;
});
}
}
main
public static void main(String[] args) throws CloneNotSupportedException {
ProxyNew proxy = new ProxyNew(new Landlord());
House house = (House) proxy.getProxyInstance();
house.rentHouse();
}
执行结果代理类通过 Proxy.newInstance() 方法生成
动态代理执行开始
要出租房
动态代理执行开始结束
这就是JDK动态代理
总结
- 静态代理,代理类需要手动编写,只适用于少量明确需求下,有不确定因素情况下不适用
- 动态代理:代理类通过 Proxy.newInstance() 方法生成,可以在程序运行中生成,比较灵活,减少编码.
- JDK实现的代理中不管是静态代理还是动态代理,代理与被代理者都要实现两样接口,它们的实质是面向接口编程.
- CGLIB 动态代理的实现机制是生成目标类的子类,通过调用父类(目标类)的方法实现,在调用父类方法时再代理中进行增强