definición:
Proporcione un sustituto o marcador de posición para que otro objeto controle el acceso a él.
Un proxy para otros objetos para controlar el acceso a este objeto.
Descripción general:
Generalmente contiene tres roles: tema abstracto, tema concreto y tema de agente.
Diagrama de clase general:
Código general:
paquete proxy; // Clase de tema abstracto: sujeto de interfaz pública {public void dosomthing ();} paquete proxy; // clase de tema específica clase pública RealSubject implementa sujeto {@Override public void dosomThing () {System.out.println ("Logic de negocios ..."); }} paquete proxy; // proxy topic class proxy implementa sujeto {privado asunto sub = null; @Override public void dosomething () {this.sub.dosomthing (); } Public Proxy (sujeto sub) {this.sub = sub; }} paquete proxy; // Cliente de clase pública Cliente de clase {public static void main (string [] args) {Sujeto realSub = new RealSubject (); Sujeto proxy = nuevo proxy (RealSub); proxy.dosomting (); }}ventaja :
1. Responsabilidades claras
2. Alta expansión
Extensiones del modo proxy:
Agente normal:
Las clases temáticas específicas son transparentes a los niveles de alto nivel, y las clases temáticas específicas se construyen en clases temáticas proxy.
Implementación del código:
Paquete GeneralProxy; sujeto de la interfaz pública {public void dosomething ();} paquete GeneralProxy; public class RealSubject implementa sujeto {private String name = null; @Override public void dosomething () {System.out.println (this.name + "proxy, ejecutando lógica comercial ..."); } public RealSubject (sujeto proxy, nombre de cadena) lanza la excepción {if (proxy == null) {Throw New Exception ("no se puede crear el objeto proxy"); } else {this.name = name; }}} paquete GeneralProxy; Public Class Proxy implementa sujeto {Sujeto privado realSub = null; public proxy (nombre de cadena) {try {realSub = new RealSubject (this, nombre); } catch (Exception e) {E.PrintStackTrace (); }} public void dosomething () {RealSub.DoSomething (); }} paquete GeneralProxy; Cliente de clase pública {public static void main (String [] args) {// ordinary proxy sujeto proxy = new proxy ("zhang san"); proxy.dosomethaing (); }}
Proxy forzado:
Debe obtener el objeto de la clase de tema proxy accediendo a la clase de tema específica y luego usar la clase de temas proxy para controlar el acceso.
Implementación del código:
paquete mustproxy; sujeto de interfaz pública {public void dosomething (); sujeto público getProxy ();} paquete MustProxy; public class RealSubject implementa sujeto {private String name = null; Sujeto privado proxy = nulo; @Override public void dosomething () {if (isProxy ()) {System.out.println (this.name + "proxy, ejecutando la lógica comercial ..."); } else {System.out.println ("Por favor, acceda al proxy primero ..."); }} public RealSubject (nombre de cadena) {this.name = name; } sujeto público getProxy () {proxy = new Proxy (this); devolver esto.proxy; } private boolean isProxy () {if (this.proxy == null) {return false; } else {return true; }}} paquete MustProxy; Public Class Proxy implementa sujeto {Sujeto privado realSub = null; Public Proxy (Sujeto RealSub) {this.RealSub = RealSub; } public void dosomething () {this.RealSub.DoSomething (); } sujeto público getProxy () {return esto; }} paquete MustProxy; Cliente de clase pública {public static void main (string [] args) {someter realSub = new RealSubject ("Zhang San"); RealSub.Dosomething (); Sujeto proxy = RealSub.getProxy (); proxy.dosomting (); }} Escenarios de aplicación
En el mundo real, el Secretario es equivalente a un agente. Si el jefe celebra una reunión, notifique a los empleados de la hora de la reunión, organice el lugar, ordene el lugar después de la reunión, etc., etc., puede entregar el trabajo relacionado con la reunión al Secretario. El jefe solo necesita celebrar la reunión y no necesita hacer esas cosas en persona. Del mismo modo, en nuestra programación, también podemos usar el patrón de proxy para desacoplar el código que se combina con una serie de lógica no relacionada, como el código de registro en el código de negocio se puede realizar en el proxy. La AOP de Spring es una aplicación de proxy dinámica típica.
Formulario de aplicación del modo proxy
(1) Proxy remoto: puede ocultar el hecho de que existe un objeto en diferentes espacios de dirección. También permite a los clientes acceder a objetos en máquinas remotas. Las máquinas remotas pueden tener un mejor rendimiento informático y velocidad de procesamiento, y pueden responder rápidamente y procesar las solicitudes de los clientes.
(2) El proxy virtual permite que los objetos con alto nivel de memoria se creen cuando sea necesario. Crear solo cuando realmente necesitemos este objeto.
(3) El proxy de copia en escritura se usa para controlar la copia de los objetos retrasando la copia de objetos hasta que el cliente realmente los necesite. Es una variante del proxy virtual.
(4) Proxy (acceso) proxy) proporciona diferentes niveles de derechos de acceso de objetos objetivo para diferentes clientes
(5) El proxy de caché proporciona almacenamiento temporal para resultados computacionales de gastos generales. Permite a varios clientes compartir resultados para reducir la latencia de cálculo o red.
(6) El proxy de firewall controla el acceso a los recursos de la red y protege al sujeto de clientes maliciosos.
(7) SyncronizationProxy proporciona acceso seguro al tema en el caso de múltiples subprocesos.
(8) Proxy de referencia inteligente: cuando se hace referencia a un objeto, proporciona algunas operaciones adicionales, como registrar el número de llamadas a este objeto, etc.
(9) El proxy de ocultación de complejidad se utiliza para ocultar la complejidad de una colección compleja de una clase y realizar control de acceso. A veces también se llama proxy de fachada, que no es difícil de entender. El modo de apariencia y proxy oculto complejo son diferentes porque el proxy controla el acceso, mientras que el modo de apariencia es diferente porque el proxy controla el acceso, mientras que el modo de apariencia solo proporciona otro conjunto de interfaces.