设计模式之动态代理

动态代理和静态代理同属于代理模式。所不同的是,在Java中,动态代理的代理者对象是由Jdk给我们提供的。
以上次租房为案例,真实角色和共同接口如下:

//  共同的接口
interface Rent{
    abstract void rentHouse();
}

//  真实对象
class Person implements Rent{
    @Override
    public void rentHouse() {
        System.out.println("Person rent house");

    }
}

不同的是,代理对象不用我们一次次的手动提供了

// 代理对象
class ProxyHandler implements InvocationHandler {
    private Object obj;
    public Object bind(Object obj) {

        this.obj = obj;
        // 返回被代理对象的实例
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object result = null;

        //  AOP编程,如数据库事务
        //if(method.getName().equals("save/update/delete...")) {..}

        //  调用真正要执行的方法
        result = method.invoke(obj, args);

        //  AOP...

        return result;
    }
}
  • 和静态代理类似,动态代理中代理者也要持有被代理者的引用,这里用Object这个所有类的父类接收,这样动态代理就具有了更多的通用性。
  • 联系上个实例,在静态代理中,我们手动实现了某个类的某个具体接口。而在动态代理中则不同,我们是通过反射,拿到类的实例和相应的接口,然后通过invoke方法来调用,这样同样是获得了更好的通用性,不必拘泥于某个具体的类了。
  • 在invoke方法调用时,我们可以进行一些其他的操作。例如Java中的AOP编程中,实现事务就是如此

最后是使用上面的动态代理

public static void main(String[] args) {
        ProxyHandler proxyHandler = new ProxyHandler();
        Rent rentProxy = (Rent) proxyHandler.bind(new Person());

        rentProxy.rentHouse();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hober.z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值