Proxy

作者: 93张先生 | 来源:发表于2020-09-15 09:31 被阅读0次

    代理模式

    In proxy design pattern, a proxy object provide a surrogate or placeholder for another object to control access to it. Proxy is heavily used to implement lazy loading related usecases where we do not want to create full object until it is actually needed.

    在代理模式中,在代理对象中定义了一个被代理对象,然后控制被代理对象的访问,代理对象还经常被用来实现懒加载,只有当我们真实需要的这个对象时,才会去创建它,平常只是持有一个代理对象。

    特征

    • 代理对象中定义了一个被代理对象,调用被代理对象的方法
    • 用来控制被代理对象的访问
    • 经常用来做懒加载使用

    UML 图

    image.png

    组件

    • Subject:包含特定功能的接口
    • Real Subject:是 Subject 接口的具体实现类,需要被代理的对象
    • Proxy:代理类,继承了 Real Subject 类,定义了一个被代理对象的成员变量,代理类会被外界所调用,然后再通过代理类,调用被代理对象的方法。

    场景

    RealObject
    public interface RealObject {
        public void doSomething();
    }
    
    RealObjectImpl
    public class RealObjectImpl implements RealObject {
     
        @Override
        public void doSomething() {
            System.out.println("Performing work in real object");
        }
     
    }
    
    RealObjectProxy
    public class RealObjectProxy extends RealObjectImpl 
    {
        @Override
        public void doSomething() 
        {
            //Perform additional logic and security
            //Even we can block the operation execution
            System.out.println("Delegating work on real object");
            super.doSomething();
        }
    }
    
    Client
    public class Client 
    {
        public static void main(String[] args) 
        {
            RealObject proxy = new RealObjectProxy();
            proxy.doSomething();
        }
    }
    

    MyBatis 中的应用

    MyBatis 中的 ConnectionLogger 使用了 JDK 动态代理,代理了一个 Connection 对象,控制了对 Connection 对象的访问,添加了日志记录功能,返回一个代理对象。


    Hibernate 中懒加载代理模式

    懒加载是通过代理模式实现的,生成一个 User 实体类的代理对象,通过JDK 动态代理生成。通常 Session.load() 方法只返回 User 的代理对象,然后调用 user.getName() 方法,会通过动态代理的 invoke() 方法触发数据库的真实查询。

    参考:
    https://cloud.tencent.com/developer/article/1066015
    https://www.javatt.com/p/96936

    相关文章

      网友评论

        本文标题:Proxy

        本文链接:https://www.haomeiwen.com/subject/inyoektx.html