Comprender y usar patrones de diseño puede cultivar nuestros buenos hábitos de programación orientados a objetos, y en aplicaciones reales, podemos disfrutar de la diversión de estar a gusto.
El proxy es un modelo relativamente útil, y hay muchas variantes. Explicado como: desde el punto de partida hasta una capa intermedia entre los destinos, que significa agente.
Definido en el patrón de diseño: proporciona un proxy para que otros objetos controlen el acceso a este objeto.
Por qué usar el modo proxy
1. Mecanismo de autorización Los usuarios de diferentes niveles de autorización tienen diferentes derechos de acceso al mismo objeto. (usuarios no registrados), y en Jive esto le permite controlar los derechos de acceso de estos dos usuarios al foro a través de un proxy como ForumProxy.
2. Un cliente no puede operar directamente a un objeto, pero debe interactuar con ese objeto.
Dar dos ejemplos específicos:
1. Si el objeto es una imagen grande y lleva mucho tiempo mostrarlo, cuando la imagen se incluye en el documento, use el editor o el navegador para abrir el documento, y el documento debe abrirse muy rápidamente y no puede esperar .
2. Si ese objeto está en un servidor remoto en Internet y opera directamente este objeto puede ser lento debido a la velocidad de red, entonces podemos usar proxy para reemplazar ese objeto primero.
En resumen, el principio es que para los objetos con alto nivel de sobrecarga, se crean solo cuando lo usan. Por lo tanto, algunas personas piensan que Java consume memoria de recursos, y creo que esto tiene algo que ver con la idea de programación.
Cómo usar el modo proxy
Tomando el sistema del foro Jive como ejemplo, hay muchos tipos de usuarios que visitan el sistema del foro: usuarios ordinarios registrados, gerentes de foro, gerentes de sistemas y turistas. Solo registrando un usuario ordinario puede hablar.
El foro es la interfaz central de Jive.
Los usuarios con varios niveles de permisos se definen en Forumpermissions:
La copia del código es la siguiente:
Public Class Forumpermissions implementa caché {
/**
* Permiso para leer el objeto.
*/
Public static final int read = 0;
/**
* Permiso para administrar todo el sistema.
*/
Public static final int sistema_admin = 1;
/**
* Permiso para administrar un foro en particular.
*/
Public static final int foro_admin = 2;
/**
* Permiso para administrar un usuario en particular.
*/
public static final int user_admin = 3;
/**
* Permiso para administrar un grupo en particular.
*/
Public static final int group_admin = 4;
/**
* Permiso para modernar hilos.
*/
Public static final int moderate_threads = 5;
/**
* Permiso para crear un nuevo hilo.
*/
public static final int create_thread = 6;
/**
* Permiso para crear un nuevo mensaje.
*/
Public estática final int create_message = 7;
/**
* Permiso a los mensajes modernos.
*/
Public static final int moderate_messages = 8;
.....
Public boolean issystemorforumadmin () {
return (valores [foro_admin] || valores [system_admin]);
}
.....
}
Por lo tanto, varios permisos de operación en Forum están relacionados con el nivel de usuario definido por ForumPermissions. Por ejemplo, al modificar el nombre del foro, solo el administrador del foro o el administrador del sistema pueden modificarlo, el código es el siguiente:
La copia del código es la siguiente:
Foro de foro de clase pública Implementa Foro {
Permisos privados de forumpermissions;
Foro privado Foro;
this.authorization = autorización;
Public ForumProxy (Foro de Foro, Autorización de autorización,
Permisos de ForumPermissions) {
this.forum = foro;
this.authorization = autorización;
this.permissions = permisos;
}
.....
Public void setName (nombre de cadena) lanza UnauthorizedException,
ForumalreadyExistSexception {
// Solo el administrador del sistema o foro puede modificar el nombre if (permissions.issystemorforumadmin ()) {
foro.setName (nombre);
}
demás {
tirar nueva no autorizadaxception ();
}
}
...
}
DBFORUM es la implementación real del foro de interfaz.
La copia del código es la siguiente:
Foro de implementos de clase pública DBForum, caché {
...
public void setName (nombre de cadena) lanza ForumalreadyExistSexception {
....
this.name = name;
// Aquí realmente guarda el nuevo nombre en la base de datos en SaveTodb ();
....
}
...
}
Cada vez que el evento de modificar el nombre del foro está involucrado, otros programas deben tratar primero con Forumproxy.
En aplicaciones diarias, es inevitable que la autorización del sistema o el sistema de seguridad siempre estén involucrados.
Sigamos hablando más profundamente en combinación con Jive, y el modelo de fábrica estará involucrado a continuación.
Ya sabemos que el uso del foro requiere el uso de ForumProxy. Singleton se usa aquí (también uno de los patrones de diseño), GetInstance () devuelve ForumFactoryProxy.
¿Por qué no devolver ForumFactory, sino devolver la implementación de ForumFactory ForumFactoryProxy? La razón es obvia, y es necesario determinar si el foro tiene permiso para crearlo a través del proxy.
En ForumFactoryProxy vemos el código de la siguiente manera:
La copia del código es la siguiente:
Public Class ForumFactoryProxy extiende ForumFactory {
Factory Proteged ForumFactory;
autorización de autorización protegida;
Permisos protegidos de ForumPermissions;
Public ForumFactoryProxy (autorización de autorización, ForumFactory Factory, ForumPermissions permisos) {
this.factory = fábrica;
this.authorization = autorización;
this.permissions = permisos;
}
Foro público CreateForum (nombre de cadena, descripción de cadena)
lanza no autorizedException, forumalreadyexistsexception {
// Solo los administradores del sistema pueden crear foro
if (permissions.get (forumpermissions.system_admin)) {
Foro newforum = factory.createForum (nombre, descripción);
devolver nuevo ForumProxy (NewForum, Autorización, Permisos);
}
demás {
tirar nueva no autorizadaxception ();
}
}
}
El método de createforum devuelve ForumProxy.
Observe que hay dos proxy aquí: ForumProxy y ForumFactoryProxy. Representa dos responsabilidades diferentes: usar el foro y la creación del foro. En cuanto a por qué usar objetos se separa de la creación de objetos, es por eso que se usa el patrón de fábrica: es para "encapsulación" y "despacho". En otras palabras, las funciones son lo más solteras posible para facilitar el mantenimiento y la modificación.
Otra creación y uso de publicaciones en el sistema de foro Jive se basa en la idea del foro.
Arriba discutimos cómo usar proxy para el acceso al mecanismo de autorización. Copiar un objeto enorme y complejo es una operación muy costosa. Use un proxy para retrasar este proceso de copia.
Por ejemplo: tenemos una gran colección, como hashtable, y muchos clientes accederán al mismo tiempo. Uno de los clientes especiales debe realizar la adquisición continua de datos, y en este momento, se requiere que otros clientes ya no agregen ni eliminen las cosas a la hashtable.
La solución más directa es: use el bloqueo de recolección, permita que este cliente especial obtenga este bloqueo, realice la adquisición de datos continuos y luego suelte el bloqueo.
La copia del código es la siguiente:
Public void fofetches (hashtable ht) {
sincronizado (ht) {
// Acción específica de adquisición de datos continuos ...
}
}
Sin embargo, este método puede bloquear la colección durante mucho tiempo, y otros clientes no podrán acceder a la colección durante este período.
La segunda solución es cerrar la recopilación y luego dejar que los datos continuos obtengan la operación de recopilación para el clon. Esta solución se basa en el hecho de que la colección es clonable y debe haber un método para proporcionar un clon profundo. Hashtable proporciona su propio método clon, pero no el clon de los objetos clave y valor.
La copia del código es la siguiente:
Public void fofetches (hashtable ht) {
Hashttable newht = (hashtable) ht.clone ();
}
El problema viene nuevamente.
La solución final: podemos esperar hasta que otros clientes hayan completado la modificación antes de la clonación, es decir, este cliente especial primero realiza una serie de operaciones de adquisición de datos llamando a un método llamado clon. Pero, de hecho, no se realizó ninguna copia de objetos hasta que otros clientes modifiquen la colección de objetos.
Implemente esta solución usando Proxy, que es la operación de copia en escritura.
El proxy tiene una amplia gama de aplicaciones.