代理模式
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
网友评论