定义:
使用代理对象完成用户请求,屏蔽用户对真实对象的访问
应用场景:
- 因为安全原因,需要屏蔽客户端直接访问真实对象
- 远程调用时,需要使用代理类处理远程方法调用的技术细节
- 为了提升系统性能,对真实对象进行封装,从而达到延迟加载的目的
结构:
角色 | 作用 |
---|---|
接口类 | 定义代理类和真实业务类的公共对外方法 |
真实业务类 | 真正实现业务逻辑的类 |
代理类 | 用来代理和封装【真实业务类】 |
客户端 | 使用代理类完成业务 |
案例:(延迟加载)
接口类:
public interface QueryInterface {
void outStr();
}
真实业务类:
public class QueryImp implements QueryInterface{
public QueryImp() {
try{
//重量级对象
Thread.sleep(3000);
System.out.println("处理业务逻辑");
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void outStr() {
System.out.println("输出方法:aaa");
}
}
代理类:
public class QueryImpProxy implements QueryInterface {
//轻量级对象
private static class GetQueryImp{
//在真正需要的时候才创建真实对象,因为创建真实对象的时候会有业务逻辑,耗时较长
private static QueryImp queryImp=new QueryImp();
};
@Override
public void outStr() {
GetQueryImp.queryImp.outStr();
}
}
客户端:
public class TestApp {
public static void main(String[] args){
System.out.println("开始(使用代理):"+ DateUtils.getCurrDateTime());
QueryInterface inter=new QueryImpProxy();//使用代理
// inter.outStr();//真正使用的时候才创建真实对象
System.out.println("结束(使用代理):"+ DateUtils.getCurrDateTime());
System.out.println("开始(未使用代理):"+ DateUtils.getCurrDateTime());
QueryInterface inter1=new QueryImp();//未使用代理,在此直接创建真实对象
// inter1.outStr();
System.out.println("结束(未使用代理):"+ DateUtils.getCurrDateTime());
}
}
客户端执行结果:
总结:
在使用代理模式实现延迟加载时,可以有效提升系统运行速度,改善用户体验