Agente de modo-agente virtual (estructurado)

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.

Diagrama UML del modo proxy

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

138 artículos originales publicados · elogiados 34 · 150,000 visitas

Supongo que te gusta

Origin blog.csdn.net/bbj12345678/article/details/105266960
Recomendado
Clasificación