En el capítulo anterior, aprendimos acerca de los agentes remotos. Este capítulo presentará los agentes virtuales.
Hay tres tipos de agentes:
1. Agente remoto, ayúdenos a controlar el acceso a objetos remotos:
El agente remoto puede actuar como un representante local de objetos en otra JVM. El método de llamar al agente será enviado a la ejecución remota por el agente a través de la red, y el resultado será devuelto al agente a través de la red, y el agente transferirá el resultado al cliente.
2. Agente virtual, ayúdenos a controlar el acceso para crear recursos caros
Como representante de la creación de objetos caros, los agentes virtuales a menudo no crean un objeto hasta que realmente lo necesitamos. Cuando el objeto está antes y durante la creación, el agente virtual actuará como sustituto del objeto. Después de crear el objeto, el proxy delega la solicitud directamente en el objeto.
3. Proteja al agente y controle el acceso a los recursos según los permisos.
Lograr
Crearemos una interfaz de imagen y una clase de entidad que implemente la interfaz de imagen . ProxyImage es una clase de proxy que reduce la huella de memoria de la carga de objetos RealImage .
ProxyPatternDemo , nuestra clase de demostración utiliza ProxyImage para obtener el objeto Image que se cargará y lo muestra según sea necesario.
1. Cree una interfaz común entre la clase proxy y la clase real
package proxy.virtual;
/**
* 创建代理类和真正的类的共同接口
*/
public interface Image
{
void display();
}
2. Crear clase proxy y clase real
package proxy.virtual;
/**
* 图片代理类
*/
public class ProxyImage implements Image
{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName){
this.fileName = fileName;
}
@Override
public void display() {
if(realImage == null){
realImage = new RealImage(fileName);
}
realImage.display();
}
}
package proxy.virtual;
public class RealImage implements Image
{
private String fileName;
public RealImage(String fileName){
this.fileName = fileName;
loadFromDisk(fileName);
}
@Override
public void display() {
System.out.println("Displaying " + fileName);
}
private void loadFromDisk(String fileName){
System.out.println("Loading " + fileName);
}
}
3. Comience la prueba
package proxy.virtual;
/**
* 客户端模拟类
* 当用户想要访问图片的时候,先交给代理类处理,如果图片已经创建,则直接取出图片,否则在从硬盘上下载图片,所以当图片存在时,
* 则不需要再次创建RealImage 对象从硬盘上下载图片,避免大量创建 RealImage 对象,消耗内存
*/
public class Client {
public static void main(String[] args) {
Image image = new ProxyImage("timg.gif");
// 图像将从磁盘加载
image.display();
System.out.println("");
// 图像不需要从磁盘加载
image.display();
}
}
Loading timg.gif
Displaying timg.gif
Displaying timg.gif
Como se puede ver en la interfaz de prueba anterior, cuando el usuario desea acceder a la imagen, primero se entrega a la clase de agente para su procesamiento. Si la imagen ha sido creada, la imagen se saca directamente, de lo contrario la imagen se descarga del disco duro, por lo que cuando la imagen existe, No es necesario volver a crear un objeto RealImage para descargar imágenes del disco duro, para evitar crear muchos objetos RealImage y consumir memoria