对比-动态代理和静态代理

1.代码结构

 

2.代码说明

Movie:一个电影类的接口。

public interface Movie {
    void play();
}

RealMovie:真正被代理的对象,要实现Movie接口

public class RealMovie implements Movie {
    @Override
    public void play() {
        System.out.println("电影《XXX》开始了");
    }
}

ProxyMovie:静态代理实现模式,该代理也需要实现Movie接口。该静态代理新增了购票成功的方法。

public class ProxyMovie implements Movie {

    RealMovie realMovie;
    public ProxyMovie(RealMovie realMovie){
        this.realMovie=realMovie;
    }
    @Override
    public void play() {
        start();
        realMovie.play();
    }
    public void start(){
        System.out.println("购票成功");
    }
}

ProxyAll:动态代理实现模式,该代理不再实现Movie接口,而是实现动态代理提供的InvocationHandler接口。该动态代理新增了电影结束的方法。

public class ProxyAll implements InvocationHandler {
    private Object obj;
    public ProxyAll(Object obj){this.obj=obj;}
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(obj,args);
        end();
        return null;
    }
    public void end(){
        System.out.println("电影结束");
    }
}

MyTest:测试

public class MyTest {
    @Test
    public void staticProxy(){
        RealMovie realMovie=new RealMovie();
        ProxyMovie proxyMovie=new ProxyMovie(realMovie);
        proxyMovie.play();
    }
    @Test
    public void proxy(){
        RealMovie realMovie=new RealMovie();
        ProxyAll proxyAll = new ProxyAll(realMovie);
        Movie o = (Movie) Proxy.newProxyInstance(RealMovie.class.getClassLoader(), RealMovie.class.getInterfaces(), proxyAll);
        o.play();
    }
}

3.对比

静态代理和被代理的对象需要实现同一个接口,即本例中的Movie。

动态代理和被代理对象实现的是不同的接口。

动态代理通过Proxy.newProxyInstance(反射)获取指定的代理类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值