Java代理设计模式

作用:

为其他对象提供一种代理以控制对这个对象的访问。

角色:

抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理角色内部包含有真实对象的引用,从而可以操作真实对象。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

代理设计模式分为静态代理和动态代理。

静态代理:

抽象角色:

public interface Subject {
    void dosomething();
}

真实角色:

public class RealSubject implements Subject{
    @Override
    public void dosomething() {
        System.out.println("aaaaaaaaaaa");
    }
}

代理角色:

public class ProxySubject implements Subject{
    Subject sub;
    public ProxySubject(Subject sub){
        this.sub = sub;
    }
    @Override
    public void dosomething() {
        System.out.println("dosomethingPre");
        sub.dosomething();
        System.out.println("dosomethingPost");

    }
}

运用:

public static void main(String[] args) {
        ProxySubject ps = new ProxySubject(new RealSubject());
        ps.dosomething();
}

输出:

dosomethingPre
aaaaaaaaaaa
dosomethingPost

缺点:
如果类方法数量越来越多的时候,代理类的代码量是十分庞大的

动态代理:

java.lang.reflect.Proxy :Proxy类 提供创建动态代理实例的静态方法。

InvocationHandler 是一个接口,代表调用处理程序,连接代理实例和真实角色。
每个代理实例都具有这样一个调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的中的invoke方法。

理解:
动态Proxy是这样的一种类:
它是在运行生成的类,在生成时你必须提供一组Interface给它,然后该class就宣称它实现了这些interface。你可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
在使用动态代理类时,我们必须实现InvocationHandler接口。

public class ProxyHandler implements InvocationHandler{
    Object tar;
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //can do something
        method.invoke(tar, args);
        //can do something
        return null;
    }

    public Object bind(Object tar){
        this.tar = tar;
        return Proxy.newProxyInstance(tar.getClass().getClassLoader(), tar.getClass().getInterfaces(), this);
    }
}

使用:

public class ProxyTest {
    public static void main(String[] args) {
        RealSubject real = new RealSubject();
        ProxyHandler h = new ProxyHandler();
        Subject o = (Subject) h.bind(real);
        o.dosomething();
    }
}

输出:
aaaaaaaaaaa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值