静态代理与动态代理
一、 静态代理和动态代理的区别
静态代理事先知道要代理的是什么,只代理一个类
动态代只有在运行时才知道要代理的东西,代理一个接口下的多个实现
二、 静态代理和动态代理组成
1. 抽象角色:通过接口或抽象类生命真实角色的业务方法
2. 代理角色:实现抽象角色,是真实角色的代理
3. 真实角色:实现抽象角色,定义真实角色的业务,共代理角色调用
三、 静态代理的优缺点
使用静态代理模式,可以在不改变原有类的基础上,增加额外功能。但如果被代理的类数目多,则需要增加很多代理类。可以使用动态代理解决这个问题
四、 动态代理的优缺点
可以解决创建多个静态代理的麻烦,更具有灵活性。
五、 态代理模式实例
抽象角色:
public interface BuyEvent {
public void buyCar();
}
真实角色:
public class Buyer implements BuyEvent{
private String name;
public Buyer(String name){
this.name = name;
}
@Override
public void buyCar() {
System.out.println(name+"买小车啦!");
}
}
代理角色:
public class ProxyBuyer implements InvocationHandler{
private Object object;
public ProxyBuyer(Object object){
this.object = object;
}
/**
* proxy:当前代理对象
* method:需要代理的方法
* args:需要代理的方法的参数
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object obj = method.invoke(object, args);
return obj;
}
}
测试类:
public class Test {
public static void main(String[] args) {
Buyer buyer = new Buyer("左哥");
//代理对象与被代理对象关联
ProxyBuyer proxyBuyer = new ProxyBuyer(buyer);
//动态加载
BuyEvent be = (BuyEvent)Proxy.newProxyInstance(buyer.getClass().getClassLoader(), buyer.getClass().getInterfaces(), proxyBuyer);
be.buyCar();
}
}
说明:动态代理的有关接口和类是:InvocationHandler和Proxy,
(BuyEvent)Proxy.newProxyInstance(buyer.getClass().getClassLoader(),buyer.getClass().getInterfaces(), proxyBuyer);
返回该代理类的实例。
在运行时动态生成代理类。