结构型模式01-代理模式(为其他对象提供一种代理以控制这个对象的访问)

代理模式是比较常见的一种设计模式。通过代理模式,我们可以很方便通过代理对象来访问真正对象的方法。

代理模式,体现的是一种对象访问的控制。我们可以原封不动的调用被代理对象的方法,也可以在调用前后增加增强片段(advice),实现额外的特定操作,比如记日志,事务管理等。先来看下代理模式通用图(来源:设计模式之禅):


依据图,写了段简单的示例代码:

/**
 * Create by zxb on 2017/4/23
 */
interface Subject {

    void request();
}

class RealSubject implements Subject {

    @Override
    public void request() {
        System.out.println("RealSubject do something!");
    }
}

class Proxy implements Subject {

    private Subject subject;

    public Proxy(Subject subject) {
        this.subject = subject;
    }

    @Override
    public void request() {
        subject.request();
    }
}

public class ProxyExample {

    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Proxy proxy = new Proxy(realSubject);
        proxy.request();
    }
}

执行结果:



可以看到虽然是运行代理类的request方法,但是执行的实际是真实对象。

在Java中根据代理类产生方式不同,可以分为静态代理和动态代理。静态代理,就是在程序运行前,代理关系已经通过代码的方式明确。动态代理则是在运行期间生成代理类。上面的示例代码,可以认为是静态代理,因为程序运行前,代理类已经存在并且定义好了。

常见的动态代理,分为JDK 动态代理 和 CGLib 动态代理 两种。

关于JDK 动态代理实现及原理解析,请参考博文:JDK 动态代理实现及原理解析

关于CGLib 动态代理的介绍及用法,请参考博文:CGLib动态代理的介绍及用法(单回调、多回调、不处理、固定值、懒加载)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值