Patrón Proxy
En el patrón Proxy, una clase representa la funcionalidad de otra clase. Este tipo de patrón de diseño pertenece a los patrones estructurales.
El patrón Proxy controla el acceso al objeto original mediante la introducción de un objeto proxy. El objeto proxy actúa como intermediario entre el cliente y el objeto objetivo, encargándose de reenviar las solicitudes del cliente al objeto objetivo, y también puede realizar procesamiento adicional antes y después de reenviar la solicitud.
En el patrón Proxy, creamos objetos que poseen un objeto existente para proporcionar una interfaz funcional al mundo exterior.
Introducción
Intención
Proporcionar un proxy para otros objetos con el fin de controlar el acceso a este objeto.
Problemas principales que resuelve
- El patrón Proxy resuelve los problemas que pueden surgir al acceder directamente a ciertos objetos, como el alto costo de creación de objetos, la necesidad de control de seguridad o el acceso remoto, etc.
Escenarios de uso
- Cuando se necesita realizar algún control o procesamiento adicional al acceder a un objeto.
Método de implementación
- Añadir una capa intermediaCrear una clase proxy que actúe como capa intermedia del objeto real.
- Composición del proxy con el objeto realLa clase proxy mantiene una referencia al objeto real y controla el acceso.
Código clave
- Clase proxyImplementa la misma interfaz que el objeto real y añade lógica de control adicional.
- Objeto realEl objeto que realmente ejecuta la tarea.
Ejemplos de aplicación
- Accesos directosLos accesos directos en el sistema Windows actúan como proxies de archivos o programas.
- PersonificaciónSun Wukong actúa como proxy de Gao Cuilan, y Zhu Bajie no puede distinguirlos.
- Puntos de venta autorizadosAl comprar billetes de tren, los puntos de venta autorizados actúan como proxies de la estación de tren.
- ChequesActúan como proxies de los fondos de cuentas bancarias, controlando el acceso a los fondos.
- Spring AOPUsar el patrón Proxy para implementar la programación orientada a aspectos.
Ventajas
- Separación de responsabilidadesEl patrón Proxy separa el control de acceso de la lógica de negocio.
- ExtensibilidadPermite añadir funciones o controles adicionales de forma flexible.
- InteligenciaPuede manejar solicitudes de acceso de forma inteligente, como carga diferida, caché, etc.
Desventajas
- Sobrecarga de rendimientoLa adición de una capa proxy puede afectar la velocidad de procesamiento de las solicitudes.
- Complejidad de implementaciónAlgunos tipos de patrón Proxy pueden ser más complejos de implementar.
Consejos de uso
- Elija el tipo de proxy adecuado según las necesidades específicas, como proxy remoto, proxy virtual, proxy de protección, etc.
- Asegúrese de que la clase proxy tenga la misma interfaz que el objeto real, para que el cliente pueda usar el proxy de forma transparente.
Precauciones
- Diferencia con el patrón AdaptadorEl patrón Adaptador cambia la interfaz, mientras que el patrón Proxy no la cambia.
- Diferencia con el patrón DecoradorEl patrón Decorador se usa para mejorar funciones, el patrón Proxy se usa para controlar el acceso.
Estructura
Involucra principalmente los siguientes roles centrales:
Tema abstracto (Subject):
- Define la interfaz común del tema real y del tema proxy, de modo que el tema proxy pueda usarse en cualquier lugar donde se use el tema real.
Tema real (Real Subject):
- Implementa la interfaz del tema abstracto y es el objeto real representado por el objeto proxy. El cliente accede directamente al tema real, pero en algunos casos puede acceder indirectamente a través del tema proxy.
Proxy:
- Implementa la interfaz del tema abstracto y mantiene una referencia al tema real. El tema proxy generalmente proporciona funciones adicionales sobre la base del tema real, como carga diferida, control de permisos, registro de logs, etc.
Cliente:
- Utiliza la interfaz del tema abstracto para operar el tema real o el tema proxy, sin necesidad de saber cuál es la clase de implementación concreta.
Implementación
Vamos a crear unaImageinterfaz y la clase de entidad que implementaImagela interfaz.ProxyImagees una clase proxy que reduceRealImagela ocupación de memoria al cargar el objeto.
ProxyPatternDemoLa clase usaProxyImagepara obtener el objeto que se va a cargarImagey lo muestra según sea necesario.
Paso 1
Crear una interfaz.
Image.java
Paso 2
Crear una clase de entidad que implemente la interfaz.
RealImage.java
ProxyImage.java
Paso 3
Cuando se solicite, usarProxyImagepara obtenerRealImageel objeto de la clase.
ProxyPatternDemo.java
Paso 4
Ejecutar el programa, resultado de salida:
Loading test_10mb.jpg Displaying test_10mb.jpg Displaying test_10mb.jpgOtras extensiones