You are on page 1of 21

Una razn para controlar el acceso a un objeto es retrasar todo el coste de su creacin e inicializacin, hasta que sea realmente

necesario usarlo. Ya que no todos esos objetos no sern visibles en el documento al mismo tiempo.

El proxy se comporta igual que la imagen y se encarga de crearla cuando sea necesario.

El Proxy redirige las siguientes peticiones directamente a la imagen.

Debe guardar, por tanto, un referencia a la imagen despus de crear esta. El Proxy tambin almacena su extensin, esto es, su ancho y su alto.

Es aplicable cada vez que hay necesidad a un objeto mas verstil o sofisticado que un simple puntero. 1.- Proxy remoto.- proporciona un representante local de un objeto situado en otro espacio de direcciones. 2.- Proxy virtual.- crear objetos costos por encargo.

3.- Proxy de proteccin.- controla el acceso al objeto original. 4.- Referencia inteligente.- es un sustituto de un simple puntero que lleva acabo operaciones adicionales cuando se accede aun objeto.

Mantiene una referencia que permite al proxy acceder al objeto real. Proporciona una interfaz idntica a la del sujeto, de manera que un proxy pueda ser sustituido por el sujeto real.

Define la interfaz como un para el SujetoReal y el Proxy, de modo que puede usarse un proxy en cualquier sitio que se espere un sujeto real. SujetoReal (imagen) Define el objeto real representado.

El proxy redirige peticiones al sujeto real cuando sea necesario, dependiendo de tipo de proxy.

El patrn proxy introduce un nivel de indirecciones al acceder a un objeto. Hay otra optimizacin que el patrn proxy puede ocultar al cliente, llamada copiade-escritura. Al utilizar un proxy para posponer el proceso de copia nos estamos asegurando de que solo pagamos el precio de copiar el objeto en caso de que este sea modificado.

Para realizar una copia de escritura el sujeto debe tener un contador de referencias.

El patrn proxy puede explotar las siguientes caractersticas de los lenguajes.

Class imagen; Extern imagen* CargaunFicheroDeImagen(const char*); //funcion externa Class PunteroImagen Public: punteroImagen(const char* FicheroDeImagen);

Virtual PunteroImagen(); Virtual Imagen* operator->(); Virtual Imagen& operator*(); Private: Imagen* CargarImagen(); Private:

Imagen* _imagen; Imagen* _ficheroDeImagen; }; punteroImagen::PunteroImagen (const char* elFicheroDeImagen){ -ficheroDeImagen = elFicheoDeImagen; -imagen =0;

} Imagen* PunteroImagen::CargarImagen(){ If (_imagen== 0){ _imagen = CargaUnFicheroDeImagen(_ficheroDeIm agen); } Return _imagen; }

En este caso debemos implementar manualmente cada operacin del proxy que redirige la peticin al sujeto. Escribir este cdigo es una labor tediosa. Por ese motivo, es frecuente usar un preprocesador para genralo automticamente.

Usar doesVotUnderstand es smalltak proporciona un enganche que se puede usar para permitir el reenvi de automtico de peticiones. La clase proxy puede redefinir doesVotUnderstand para que el mensaje sea reenviado a su sujeto.

El principal inconveniente de doesVotUnderstand; es que la mayora de sistemas smalltak tienen unos pocos mensajes especiales que son manejados directamente por la maquina virtual, y para esto se lleva acabo la habitual bsqueda de mtodos.