动态代理模式和静态代理模式

静态代理模式:首先我们开看一张图

 

静态代理或者动态代理我们要明白代理其中代理的意思:就是通过一个媒介去代理来达成某个目的

上图中相亲网站就代理了广大相亲的美丽女士去和刘建龙进行约会(这个代理的顺序很重要,而不是相亲公司代理刘建龙)

这里引用b站狂神的几句经典的话

由此可见:广大女性(Lady真实角色)有约会(Date抽象角色)的需求,婚庆公司(proxy代理角色)帮助实现,客户(Client刘建龙)

demo结构:

代码:

public interface Date {
    void date();
}
public class Lady implements Date {
    public void date() {
        System.out.println("与刘建龙甜蜜的约会成功");
    }
}
public class Proxy implements Date {
    //组合进去
    Lady lady;

    public Proxy() {
    }

    public Proxy(Lady lady) {
        this.lady = lady;
    }

    public void date() {
        lady.date();
    }
}
public class Client {
    public static void main(String[] args) {
        Lady lady = new Lady();
        Proxy proxy = new Proxy(lady);
        proxy.date();
    }
}

值得注意的是,在写代理类的时候,要把你要代理的引用放进去,之后Client中的运行结果:

 

那么动态代理就是自动的生成你所要代理的类(相当于自动给你生成一个proxy)

那么就需要一个工具类:

//等会我们会用这个类来自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {

    //被代理的接口
    //代理谁
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    //生成得到代理类
    //生成代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }


    //处理代理实例,并返回结果
    //调用代理程序的一些执行方法
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理的本质就是使用反射机制实现
        Object result = method.invoke(target, args);
        return result;
    }

}

运用了反射的知识

public class Client {
    public static void main(String[] args) {
        Lady lady = new Lady();
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        pih.setTarget(lady);
        Date proxy = (Date) pih.getProxy();
        proxy.date();
    }
}

运行结果也是一样的

关键是要弄清楚你要代理哪一个真实的角色,才是代理的关键

 

posted @ 2020-10-05 19:22  JOYBOY-007  阅读(245)  评论(0)    收藏  举报