代理模式主要是通过代理,对真正的业务逻辑进行封装,要实现相关的业务的时候,由代理类进行相关的操作,这样一来,实现了真正业务类与系统的隔离。这么做的好处是避免了真正业务类与系统的直接接触
代理模式中涉及到四个角色分别是
主题接口(subject):真正业务类和代理类都要实现的接口
真正业务类:实现了主题接口的业务类,真正要实现的逻辑
代理类:持有真正业务类的引用,对其封装之后替其实现业务逻辑。
客户端:代理类和主题工作的地方。
下面以一个例子来说明,在这个例子中,我们先定义一个接口
public interface Query {
void request();
}
然后我们创建了实现这个接口的真正业务类,在这里我们假设这个业务类需要完成一些耗时较大的操作
public class RealQuery implements Query {
@Override
public void request() {
try {
Thread.sleep(10000);//假设这里的业务操作的初始化耗时比较长
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("这是真正的业务逻辑");
}
}
再定义一个代理类,这个代理类也是实现了主题接口
public class ProxyQuery implements Query {
private RealQuery realQuery ;
@Override
public void request() {
if (realQuery==null) {
realQuery = new RealQuery();//懒加载
}
realQuery.request();
}
}
最后我们来调用一下
public class ProxyPatternDemo {
public static void main(String[] args) {
long now = System.currentTimeMillis();
System.out.println("系统开始启动");
Query query = new ProxyQuery();
System.out.println("启动完成,耗时"+(System.currentTimeMillis()-now)+"毫秒");
query.request();//在真正需要业务调用的时候才去初始化相关配置
System.out.println("业务处理耗时:"+(System.currentTimeMillis()-now)+"毫秒");
}
}
结果:
系统开始启动
启动完成,耗时1毫秒
这是真正的业务逻辑
业务处理耗时:10005毫秒
结论:可以看出,真正业务操作耗时较长,如果我们在启动系统的时候,直接调用的话,那系统启动耗时的时间就变长,这在实际应用中可能会影响其他的业务,我们使用代理就变为延时加载。