本篇文章主要介绍了"Hibernate与代理模式",主要涉及到方面的内容,对于其他数据库感兴趣的同学可以参考一下:
代理模式:当需要调用某个对象的时候,不需要关心拿到的是不是一定是这个对象,它需要的是,我拿到的这个对象能够完成我想要让它完成的任务即可,也就是说,这时调用方可以...
代理模式:当需要调用某个对象的时候,不需要关心拿到的是不是一定是这个对象,它需要的是,我拿到的这个对象能够完成我想要让它完成的任务即可,也就是说,这时调用方可以拿到一个代理的一个对象,这个对象可以调用它想创建的对象的方法完成调用方的任务就好了。
静态代理模式模拟实例
应用场景介绍:这里有一个PDF,我想打开,但是,初始化的过程比较耗时,那么在这个时候如果在创建对象的时候直接初始化那么势必会消耗掉一定的时间,但是并不一定初始化完成以后就直接要打开,可能过一段时间之后才需要打开呢,是有可能的。
File的一个接口,这个接口定义了一个openFile的方法。
package com.siti.proxytest1;
public interface File {
/**
* 打开文件
*/
public void openFile();
}
PDFFile实现File接口,并实现openFile方法。
package com.siti.proxytest1;
public class PDFFile implements File{
/**
* sleep一秒钟表示初始化的时候的耗时
*/
public PDFFile(){
try {
Thread.sleep(1000);
System.out.println("PDF文件加载成功~");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void openFile() {
System.out.println("PDF文件打开!");
}
}
PDFFile的代理类,也要实现File接口,并实现openFile方法,在这个方法当中并不是从新的实现一遍PDFFile的openFile方法,而是将获得调用者想要创建的那个对象的实例,用这个实例去调用具体的实现方法。代码如下:
package com.siti.proxytest1;
public class PDFFileProxy implements File{
private PDFFile pdfFile;
/**
* 获取代理对象
* @param pdfFile
*/
public PDFFileProxy(PDFFile pdfFile){
this.pdfFile = pdfFile;
}
/**
* 代理对象调用openFile方法时,才会创建pdfFile对象(耗时1s);
* 然后执行对象的openFile方法完成。
*/
@Override
public void openFile() {
if(pdfFile == null){
this.pdfFile = new PDFFile();
}
pdfFile.openFile();
}
}
在这个代理类中,可以清楚的看到,当创建一个代理对象传了null参数的时候,并没有直接得到pdfFile的实例,这时候速度非常快的创建完成了,当你调用执行的时候才会创建真正的实例,并调用该对象的方法,完成调用者的请求。测试代码如下: