PROXY |
1. CLASIFICACIÓN DEL PATRÓN
Patrón Estructural.
2. INTENCIÓN
Proporcione un sustituto o un prototipo para otro objeto al acceso del control a él.
3. CONOCIDO TAMBIÉN
Surrogate.
4. MOTIVACIÓN
Una razón del acceso que controla a un objeto es diferir el coste completo de su creación e inicialización hasta que necesitemos realmente utilizarlo.
Considere un redactor del documento que pueda encajar objetos gráficos en un documento. Algunos objetos gráficos, como imágenes de trama grandes, pueden ser costosos crear. Pero la apertura de un documento debe ser rápida, así que debemos evitar crear todos los objetos costosos inmediatamente cuando se abre el documento. Este no es necesario de todos modos, porque no todos estos objetos serán visibles en el documento al mismo tiempo. Estos apremios sugerirían el crear de cada objeto costoso a pedido, que en este caso ocurre cuando una imagen llega a ser visible. ¿Pero qué ponemos en el documento en lugar de la imagen? Y ¿cómo puede ocultamos el hecho de que crear la imagen a pedido para nosotros no complica el editor implementación? Esta optimización no debería afectar el formato y representación del código.
5. POSIBLES APLICACIONES PARA EL PROXY
Se debe usar el patrón Proxy cuando:
· Un proxy remoto proporciona provee una representación local de un objeto en una dirección diferente.
· Un proxy virtual crea objetos costosos a pedido.
· Un proxy de protección controla el acceso al objeto original. Los poderes de la protección son útiles cuando los objetos deben tener diversos derechos de acceso.
· Una referencia apropiada es un reemplazo para un indicador pelado que se realice acciones adicionales cuando un objeto está alcanzado. Las aplicaciones típicas incluyen o que cuenta el número de referencias al objeto verdadero para poderlo liberar automáticamente cuando no hay referencias (también llamadas los indicadores elegantes [Ede92]). o que carga un objeto persistente en memoria cuando este primero se refirió. o que comprueba que el objeto verdadero es bloqueado antes de este tuvo acceso para asegurarse de que ningún otro objeto puede cambiarlo.
6. ESTRUCTURA
La estructura básica que maneja el proxy está compuesta por:
Fig. 1. Diagrama de clases del modelo de uso del Proxy.
7. PARTICIPANTES
· Proxy: mantiene una referencia que deja al proxy acceder al objeto real, proxy puede referir a un sujeto si el sujeto real y el sujeto tienen la misma interfaz. Provee una interfaz idéntica a la del sujeto con eso proxy puede ser sustituido por el sujeto real. Controla el acceso al sujeto real y puede ser responsable de crearlo y borrarlo.
· Subject: define la interfaz común para el realsubject y proxy con eso proxy puede ser usado en cualquier lugar que un realsubject es esperado.
· Realsubject: define el objeto real que el proxy representa.
8. COLABORACIONES
El proxy transmite a peticiones RealSubject cuando es apropiado, dependiendo de la clase de proxy.
9. CONSECUENCIAS
El patrón proxy tiene las siguientes consecuencias:
· Un proxy alejado puede ocultar el hecho de que un objeto reside en un diverso espacio de dirección.
· Un proxy virtual puede realizar optimizaciones tales como crear un objeto a pedido.
· Ambos el proxy de protección y las referencias inteligentes permiten tareas adicionales de las necesidades comunes cuando un objeto es accesado.
· Hay otra optimización que el patrón proxy puede ocultar del cliente. es llamado copia-en-escribe, y es relacionado con la creación a pedido. El copiado de un objeto grande y complicado puede ser una operación costosa. Si la copia nunca se modifica, entonces no hay ninguna necesidad de incurrir en este coste. Usando un proxy para posponer el proceso de copiado, nos aseguramos de que pagamos el precio de copiar el objeto solamente si este es modificado.
10. IMPLEMENTACIÓN
Para la implementación del Proxy es recomendable usar algunas “técnicas” para facilitar su uso.
· Sobrecargar al operador del acceso del miembro en C++. Ayudas de C++ que sobrecargan al operador ->, el operador del acceso del miembro. Sobrecargar a este operador le deja realizar el trabajo adicional siempre que un objeto no este referenciado. Esto puede ser provechoso para ejecutar algunas clases de proxy; el proxy se comporta apenas como un indicador.
· Usando doesNotUnderstand en Smalltalk. El smalltalk proporciona un gancho que usted pueda utilizar para apoyar la expedición automática de peticiones. El smalltalk llama el doesNotUnderstand: aMessage cuando un cliente envía un mensaje a un receptor que no tenga ningún método correspondiente. La clase del proxy puede redefinir doesNotUnderstand para remitir el mensaje a su tema.
· Proxy no tiene que saber siempre el tipo de tema verdadero. Si una clase del proxy puede ocuparse de su tema solamente a través de un interfaz abstracto, entonces no hay ninguna necesidad de hacer una clase del proxy para cada clase de RealSubject; el proxy puede interactuar con todo las clases del RealSubject uniformemente. Pero si los proxys van a ejemplificar RealSubjects (tal como adentro un proxy virtual), después ellos tienen que saber la clase concreta.
11. CÓDIGO DE EJEMPLO
class Graphic {
public:
virtual ~Graphic();
virtual void Draw(const Point& at) = 0;
virtual void HandleMouse(Event& event) = 0;
virtual const Point& GetExtent() = 0;
virtual void Load(istream& from) = 0;
virtual void Save(ostream& to) = 0;
protected:
Graphic();
};
class Image : public Graphic {
public:
Image(const char* file); // loads image from a file
virtual ~Image();
virtual void Draw(const Point& at);
virtual void HandleMouse(Event& event);
virtual const Point& GetExtent();
virtual void Load(istream& from);
virtual void Save(ostream& to);
private:
// ...
};
class ImageProxy : public Graphic {
public:
ImageProxy(const char* imageFile);
virtual ~ImageProxy();
virtual void Draw(const Point& at);
virtual void HandleMouse(Event& event);
virtual const Point& GetExtent();
virtual void Load(istream& from);
virtual void Save(ostream& to);
protected:
Image* GetImage();
private:
Image* _image;
Point _extent;
char* _fileName;
};
ImageProxy::ImageProxy (const char* fileName) {
_fileName = strdup(fileName);
_extent = Point::Zero; // don't know extent yet
_image = 0;
}
Image* ImageProxy::GetImage() {
if (_image == 0) {
_image = new Image(_fileName);
}
return _image;
}
12. USOS CONOCIDOS
El ejemplo del proxy virtual en la sección de la motivación es de las clases del bloque hueco del texto de ET++. NEXTSTEP [Add94] utiliza los proxys (casos de la clase NXProxy) como local representantes para los objetos que pueden ser distribuidos. Un servidor crea los proxys para los objetos alejados cuando los clientes los piden. Al recibir un mensaje, el poder lo codifica junto con sus discusiones y después transmite al mensaje codificado el tema alejado. Semejantemente, el tema codifica cualquier resultado de vuelta y lo envía de nuevo al objeto de NXProxy.
13. PATRONES ASOCIADOS
Al patrón proxy se le relaciona frecuentemente con los patrones; Adapter, Decorator, iterator.
REFERENCIAS BIBLIOGRÁFICAS
Design Patterns. Elements of Reusable Object-Oriented Software - Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides - Addison Wesley (GoF- Gang of Four)
Thinking in patterns in java – Bruce Eckel
Patterns in Java - Mark Grand – Wiley
No hay comentarios:
Publicar un comentario