代理模式笔记

拈花ヽ惹草 提交于 2020-01-31 21:17:49

什么是代理模式

为什么使用代理模式

静态代理

不使用代理时,直接调用对象的方法,使用代理后,通过代理调用对象的方法,同时可以在方法前后添加操作.
interface IAct{
    void act(int money);
}
class Actor implements IAct{
    public void act(int money) {
        System.out.println("收到"+money+"元,开始表演");
    }
}
class ProxyActor implements IAct{
    IAct actor;
    ProxyActor(IAct actor){
        this.actor=actor;
    }
    @Override
    public void act(int money) {
        // TODO Auto-generated method stub
        System.out.println("代理前的工作");
        actor.act(money);
        System.out.println("代理后的工作");
    }
    
}
public class ProxyPattern {
    public static void main(String[] args) {
        //不使用代理
        IAct ac=new Actor();
        ac.act(100);
        //使用代理后
        IAct proxy=new ProxyActor(ac);
        proxy.act(100);
    }
}

动态代理

在运行时为对象创建代理类.
public static void main(String[] args) {
        
        //动态代理
        IAct proxyActor=(IAct)Proxy.newProxyInstance(ac.getClass().getClassLoader(),
                                                         ac.getClass().getInterfaces(),
                                                         new InvocationHandler() {

                                                            @Override
                                                            public Object invoke(Object proxy, Method method,
                                                                    Object[] args) throws Throwable {
                                                                int money=(int)args[0];
                                                                System.out.println("代理前的工作");                                                               
                                                                method.invoke(ac,money/2 );    //第一个参数是方法对象, 后面的是方法形参
                                                                System.out.println("代理后的工作");
                                                                return null;
                                                            }
            
        });
        proxyActor.act(100);
    }

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!