文章目录
代理模式(Proxy Pattern)
代理模式是Java常见的设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。
为什么要采用这种间接的形式来调用对象呢?一般是因为客户端不想直接访问实际的对象,或者访问实际的对象存在困难,因此通过一个代理对象来完成间接的访问。
在现实生活中,这种情形非常的常见,比如请一个律师代理来打官司。
代理模式分为静态代理和动态代理
代理模式的UML图
代理模式中的角色:
抽象主题角色(Subject):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
具体主题角色(RealSubject):也称为委托角色或者被代理角色。定义了代理对象所代表的目标对象。
代理主题角色(Proxy):也叫委托类、代理类。代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
1.静态代理
静态代理是由程序猿创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。静态代理有两种实现方式,继承和聚合
1.1 继承
—待完善—
1.2 聚合
—待完善—
2.动态代理
动态代理是指在运行时,动态生成代理类。即,代理类的字节码将在运行时生成并载入当前的ClassLoader。与静态代理类想比,动态类有诸多好处。首先,不需要为正式主体写一个形式上完全一样的封装类,假如主题接口中的方法很多,为每一个接口写一个代理方法也是非常烦人的事,如果接口有变动,则正式主体和代理类都要修改,不利于系统维护;其次,使用一些动态代理的生成方法甚至可以在运行时指定代理类的执行逻辑,从而大大提升系统的灵活性。
2.1 jdk动态代理
2.1.1实现想路
a) 根据目标对象、代理方法(InvocationHandler里的invoke方法),通过反射机制动态生成代理类(字节形式存储)
b) 根据字节生成代理类类对象
c) 返回代理对象
2.1.2使用方法
a) 创建类,实现InvocationHandler接口,在invoke方法中写自己的增强逻辑
b) 调用Proxy.newInstance(类加载器,要实现的接口数组,目标对象)生成代理类的对象
c) 使用代理对象
2.1.2案例
—待完善—
2.2cglib动态代理
—待完善—