viernes, 29 de mayo de 2009

Patrones de Comportamiento

PATRONES DE COMPORTAMIENTO

Los patrones de comportamiento tienen mucho que ver con el flujo de control de un sistema. Determinadas maneras de establecer el control de un sistema se pueden tornar muy benéficas para el mantenimiento y la eficiencia de esta.

Los patrones de comportamiento son:

1.    Chain of responsability (Cadena de responsabilidades).
2.    Command (Comando).
3.    Interpreter (Intérprete).
4.    Iterator (Iterador).
5.    Mediator (Mediador).
6.    Memento (Recuerdo).
7.    Observer (Observador).
8.    State (Estado).

En Proceso:

9.    Strategy (Estrategia).
10.    Visitor (Visitante).
11.    Template Method (Método Plantilla).


Chain of Responsability

Propósito
Establecer una cadena en un sistema, para facilitar la respuesta a un mensaje ya que este puede ser tratado en el nivel en que se adopta o ser redirigido a un objeto que si pueda operarlo.
Aplicabilidad
Use el patrón chain of responsability cuando un mensaje deba ser manipulado por un objeto de entre diversos del sistema, exista un conjunto de objetos de un sistema que pueden ser capaces de responder al mismo mensaje de forma eficiente, algunos de los eventos pueden ser manejados en el nivel en el cual se reciben o producen mientras que los otros tengan que redirigirse a otro objeto.
Implementación
El patrón chain of responsability necesita de los siguientes elementos:
•    Handler: La interfaz en la que se define el método utilizado para pasar un mensaje al siguiente manejador.
•    ConcreteHandler: La clase que implementa la interfaz Handler. Mantiene una referencia a la siguiente instancia de Handler.
Ventajas e Inconvenientes
Brinda una gran flexibilidad para el procesamiento de sucesos de una aplicación, esta flexibilidad que regala tiene un precio por que este patron es difícil de desarrollar, comprobar y depurar.
Si se producen muchos mensajes en un pequeño lapso de tiempo y estos son redireccionados muchas veces antes de haber sido manejados, se deteriora el rendimiento del sistema
Patrones Relacionados
•    Composite: Cuando se combinan, Composite brinda soporte para una estructura basada en árbol y la propagación de mensajes, y Chain of responsability proporciona las reglas de propagación de estos mensajes.

Command

Propósito
Encapsula un comando dentro de un objeto de manera que pueda ser almacenado, pasado como parámetro a métodos y devuelto al igual que cualquier otro objeto.
Aplicabilidad
Use el patrón Command cuando se necesita poner en cola y ejecutar diferentes comandos en momentos distintos, cuando sea requerido dar soporte para deshacer comandos, transacciones y procesos de identificación, cuando desea desacoplar la fuente de una petición de un objeto que la cumple cierta función.
Implementación
El patrón Command necesita de los siguientes elementos:
•    Command: la interfaz en la que se definen los métodos utilizados por el Invoker usado.
•    Invoker: El invocador del método execute del objeto Command.
•    Receiver: El objetivo del Command que cumple la petición, contiene toda la información necesaria para ello.
•    ConcreteCommand: Implementación de la interfaz Command. Mantiene una referencia al receptor Receiver.
Ventajas e Inconvenientes
Command es muy flexible en el sentido de que desacopla el disparador del evento del objeto que posee las herramientas y el conocimiento para ejecutarlo, facilita la introducción de nuevos comandos (hacer otra implementación y meterla a la aplicación), coopera con diversos objetos para compartir instancias de Command y también tiene la posibilidad de sustituir objetos Command o Receiver en período de ejecución.
Patrones Relacionados
•    Composite: Usa Composite para implementar MacroCommand.
•    Memento: Almacena el estado del objeto que recibe el comando para poder tolerar la función de deshacer este comando.
•    Prototype: Es utilizado para duplicar el comando antes de archivarlo en el historial. 
•    Singleton: El historial comúnmente se implementa como un Singleton.

Interpreter

Propósito
Definir un intérprete para un lenguaje.
Aplicabilidad
Use el patrón Interpreter cuando la eficiencia no sea un factor tan fundamental, cuando haya que interpretar un lenguaje sencillo, cuando la solución de un problema consiga ser formulada en ese lenguaje.
Implementación
El patrón Interpreter necesita de los siguientes elementos:
•    Expression: La interfaz a travçes de la cual el cliente interactçua con las expresiones.
•    TerminalExpression: La implementaciçon de la interfaz Expression para nodos terminales en la gramçatica y el carbol de sintaxis.
•    NonTerminalExpression: La otra implementación de la interfaz Expression para nodos no terminales de la gramática y el árbol de sintaxis.
•    Context: El contenedor de la informaciçon que se necesita en distintos lugares del interpreter.
•    Cliente: Construye o destruye o recibe una intancia de un árbol de sintaxis abstracta.
Ventajas e Inconvenientes
Se puede cambiar de forma cómoda el intérprete para reflejar los cambios en la gramática, además las expresiones son reutilizables para otros fines. Se pueden añadir métodos a la interfaz para ampliar la funcionalidad de las expresiones.
Use el patrón Interpreter cuando la gramática es muy grande y pueda ser difícil implantar el árbol de la sintaxis ya que no esta definido en el patrón.
Patrones Relacionados
•    Composite: La forma de las expresiones interpretadas se basa en Composite usando nodos y hojas, y nodos rama.
•    Flyweight: Se puede emplear en algunas de las expresiones, para disminuir la cantidad de objetos similares.
•    Iterator: Se implementa para recorrer el árbol de sintaxis y sus nodos.
•    Visitor: Cuando este patrón se implementa Interpreter adquiere flexibilidad.

Iterator

Propósito
Suministrar una manera lógica de acceder de forma secuencial a los elementos existentes en una colección sin importar el tipo de colección.
Aplicabilidad
Use el patrón Iterator cuando necesite admitir el recorrido de muchas colecciones, dejando que diversos clientes indaguen al mismo tiempo por dicha colección, cuando necesite aportar una manera análoga, logia e independiente de su implementación paráis poder recorrer la colección.
Implementación
El patrón Iterator necesita de los siguientes elementos:
•    Iterator: En esta interfaz se definen los métodos estándar de iteración.
•    ConcreteIterator: Clases que implementan la interfaz Iterator. Estas clases referencian la colección subyacente.
•    Aggregate: Esta interfaz define un método de fabricación para generar un iterador.
•    ConcreteAggregate: Esta clase implementa la interfaz Aggregate, construyendo objetos ConcreteIterator bajo demanda.
Ventajas e Inconvenientes
Define una interfaz única para recorrer una colección aportándole dinamismo al proceso, permiten tener muchos puntos de navegación para la misma colección.
El mayor inconveniente es que crean la ilusión de estructuras con orden o en otros casos con desorden.
Patrones Relacionados
•    Factory Method: En las clases que simbolizan colecciones comúnmente se define un método fábrica para así crear el iterador.
•    Visitor: Cuando este patrón se usa en conjuntos de objetos, casi siempre se usa un iterador para recorrer los elementos. 

Mediator

Propósito
Define un objeto que encapsula cómo interaccionan un conjunto de objetos. Favorece un bajo acoplamiento, liberando a los objetos de referenciarse unos a otros explícitamente, y permite variar la interacción de manera independiente.
Aplicabilidad
Use el patrón Mediator cuando un conjunto de objetos se comunica entre sí de una forma bien definida, pero compleja. Las interdependencias son poco estructuradas y difíciles de comprender, cuando reutilizar una clase es difícil porque tiene dependencias con muchas otras clases, cuando un comportamiento que es distribuido entre varias clases debería ser adaptable sin crear muchas subclases.
Implementación
El patrón Mediator necesita de los siguientes elementos:
•    Mediator: Define una interface para comunicarse con los objetos colegas.
•    ConcreteMediator: Implementa el comportamiento cooperativo entre los colegas (como se comunican entre ellos). Además los conoce y mantiene.
•    Colleagues: Cada colega conoce su mediador, y usa a este para comunicarse con otros colegas.
Ventajas e Inconvenientes
Evita crear subclases de los colegas, sólo se crean subclases del mediador, además desacopla a los colegas.
Simplifica los protocolos entre las clases y abstrae el cómo cooperan los objetos, centraliza el control en el mediador, por lo tanto la clase es difícil de mantener.
Patrones Relacionados
•    Factory Method: En las clases que simbolizan colecciones comúnmente se define un método fábrica para así crear el iterador.
•    Visitor: Cuando este patrón se usa en conjuntos de objetos, casi siempre se usa un iterador para recorrer los elementos.

Memento

Propósito
Captura y externaliza el estado interno de un objeto, sin violar la encapsulación, de modo que el objeto puede ser restaurado a este estado más tarde.
Aplicabilidad
Use el patrón Memento cuando una parte del estado de un objeto debe ser guardado para que pueda ser restaurado más tarde y una interfaz para obtener el estado de un objeto podría romper la encapsulación exponiendo detalles de implementación.
Implementación
El patrón Memento necesita de los siguientes elementos:
•    Memento: Almacena el estado interno de un objeto Originator. El Memento puede almacenar todo o parte del estado interno de Originator. Tiene dos interfaces, una para Caretaker, que le permite manipular el Memento únicamente para pasarlo a otros objetos, la otra interfaz sirve para que Originator pueda almacenar o restaurar su estado interno, sólo Originator debería acceder a esta interfaz.
•    Originator: Originator crea un objeto Memento conteniendo una fotografía de su estado interno. Originator usa a Memento para restaurar su estado interno.
•    Caretaker: Es responsable por mantener a salvo a Memento.No opera o examina el contenido de Memento.
Ventajas e Inconvenientes
Mantiene la encapsulación. Simplifica la clase Creador ya que no debe preocuparse de mantener las versiones del estado interno
Podría incurrir en un considerable gasto de memoria: encapsular y restaurar el estado no debe ser costoso, puede ser difícil en algunos lenguajes asegurar que sólo el Creador tenga acceso al estado del Memento.
Patrones Relacionados
•    Command: Utiliza Mementos para registrar el estado de las acciones que no se pueden deshacer.
•    State: La mayoría de los estados usan Memento.

Observer

Propósito
Define una dependencia uno-a-muchos entre objetos, de modo que cuando cambia el estado de un objeto, todos sus dependientes automáticamente son notificados y actualizados.
Aplicabilidad
Use el patrón Observer cuando cuando un cambio de estado en un objeto requiere cambios en otros objetos, y no sabe sobre qué objetos debe aplicarse el cambio, cuando un objeto debe ser capaz de notificar algo a otros objetos, sin hacer asunciones sobre quiénes son estos objetos.
Implementación
El patrón Observer necesita de los siguientes elementos:
•    Subject: Conoce a sus observadores. Provee una interfaz para agregar y quitar observadores.
•    Observer: Define una interfaz para recibir notificaciones.
•    ConcreteSubject: Almacena estado de interés para los observadores. Notifica a los observadores cuando cambia su estado.
•    ConcreteObserver: Mantiene una referencia al ConcreteSubject. Mantiene estado que debe estar sincronizado con el del ConcreteSubject.
Ventajas e Inconvenientes
Presenta acoplamiento abstracto y mínimo entre Subject y Observer lo cual quiere decir: 
•    Subject no necesita conocer las clases concretas de observers. 
•    Permite modificar independientemente subjects y observers.
•    Pueden reutilizarse por separado.
•    Pueden añadirse observers sin modificar el subject.
Patrones Relacionados
•    Proxy: En la comunicación distribuida, se usa remote proxy para gestionar la comunicación entre el Observer y Observable

State

Propósito
Permite a un objeto cambiar su comportamiento cuando cambia su estado. El objeto parece cambiar de clase.
Aplicabilidad
Use el patrón State cuando el comportamiento del objeto depende de su estado, y debe cambiar su comportamiento en tiempo de ejecución dependiendo de su estado, cuando las operaciones tienen grandes estructuras Case que dependen del estado del objeto, que es representado por uno o más constantes de tipo enumerado.
Implementación
El patrón State necesita de los siguientes elementos:
•    Context: Este integrante define la interfaz con el cliente. Mantiene una instancia de ConcreteState (Estado Concreto) que define su estado actual.
•    State: Define una interfaz para el encapsulamiento de la responsabilidades asociadas con un estado particular de Context.
•    ConcreteState: Cada una de estas subclases implementa el comportamiento o responsabilidad de Context.
Ventajas e Inconvenientes
Coloca todo el comportamiento asociado a un particular estado en una clase, lo cual hace muchos más manejable los estados de los objetos. Presenta un reemplazo de sentencias Case por subclases, esto ayuda a evitar estados inconsistentes, lo cual hace que transiciones de estado son más explícitas. Incrementa el número de objetos, donde los objetos estado pueden ser Singleton.
Patrones Relacionados
•    Flyweight: Los estados pueden ser compartidos usando el patrón Flyweight.
•    Singleton: La mayoría de los estados son Singleton especialmente cuando son Flyweight.

miércoles, 27 de mayo de 2009

Patrones Estructurales

Patrones Estructurales

Los patrones estructurales están relacionados con cómo las clases y los objetos se combinan para dar lugar a estructuras más complejas.

Los patrones estructurales asociados con objetos describen formas de componer los objetos para conseguir nueva funcionalidad. La flexibilidad de la composición de objetos viene de la posibilidad de cambiar la composición en tiempo de ejecución, lo que es imposible con la composición estática de clases.

Los patrones de comportamiento son:

1.    Adapter
2.    Bridge
3.    Composite
4.    Decorator
5.    Facade
6.    Flyweight
7.    Proxy


Adapter

Propósito
Sirve como un intermediario entre dos clases, convirtiendo las interfaces de una clase para que pueda ser utilizada por otra.
Aplicabilidad
Use el patrón Adapter cuando desee utilizar un objeto en un entorno que espera una interfaz distinta de la ofrecida por el objeto, cuando deba realizar una traducción entre las interfaces de varios objetos, cuando un objeto deba actuar como intermediario para un grupo de clases y solo es posible saber en tiempo de ejecución que clases será utilizada.
Implementación
El patrón Adapter necesita de los siguientes elementos:
•    Framework: Utiliza el Adapter. Puede construir el ConcreteAdapter u obtenerlo de alguna forma.
•    Adapter: La interfaz que define los métodos utilizados por el Framework.
•    ConcreteAdapter: Es la implementación de la interfaz Adapter. Tiene una referencia a Adaptee y traduce las llamadas de los métodos del Framework en llamadas al Adaptee.
•    Adaptee: La interfaz que define los métodos que serán adaptados. Esta interfaz permite que se cargue dinámicamente el Adaptee específico en tiempo de ejecución.
•    ConcreteAdaptee: La implementación de la interfaz Adaptee. La clase que necesita ser adaptada para que pueda ser utilizada por el Framework.
Ventajas e Inconvenientes
Este Patrón ofrece una gran oportunidad para la reutilización del código, permitiendo que interactúen dos o más objetos que supuestamente son incompatibles. Solo se requiere una buena planificación para crear una interfaz suficientemente flexible para que pueda ser adaptado correctamente.
Hay que tener cuidado con la correcta correspondencia en la transferencia de argumentos entre el Framework y el Adaptee.
Patrones Relacionados
•    Bridge: Permite que la separación de la abstracción y la implementación pueda comunicarse con mensajes que sin el Adapter serian incompatibles.
•    Decorator: Este patrón mejora la funcionalidad de la interfaz del Adapter.


Bridge

Proposito
Fraccionar un elemento complejo en dos jerarquías como lo es la abstracción funcional y la implementación interna, facilitando así los cambios en este elemento.
Aplicacilidad
Use el patrón Bridge cuando desee hacer algunos cambios a la implementación y estos no deban ser visibles para el cliente, cuando existan muchas abstracciones e implementaciones de componentes, cuando se requiera flexibilidad entre implementación y abstracción del componente.
Implementación
•    Abstraction: Define la abstracción fundamental de Bridge, proporcionando un comportamiento y una interfaz y una estructura estándar.
•    RefineAbstraction: Hereda de la clase Abstraction y proporciona un comportamiento.
•    Implementation: La interfaz que representa la funcionalidad utilizada por las instancias de la Abstraction.
•    ConcreteImplementation: Implementa la interfaz Implementation. Proporciona el comportamiento y la estructura para las clases Implementation.
Ventajas e Inconvenientes
Permite compartir las implementaciones de los objetos entre diversos objetos abstraction, también proporciona una mayor flexibilidad, cuando se cambia la implementación y esto sucede sin que el cliente tome parte en la acción, el desarrollo futuro de bridge mostrará que hay elementos del comportamiento substancial representan variaciones en la implementación o en la abstracción.
Patrones relacionados
•    Adapter: Permite usar un objeto que su interfaz seria compatible en cualquier caso.
•    Singleton: Cuando las clases “implementación” pueden ser compartidas.
•    Flyweight: Cuando la estructura se convierte en un árbol muy grande el patrón flyweight ayuda a disminuir el número de objetos tramitados por el árbol.


Composite

Propósito
Desarrollar una forma fácil de hacer jerarquías en forma de árbol de una complejidad arbitraria, permitiendo al mismo tiempo que todos los elementos de la estructura sean operados con una misma interfaz.
Aplicabilidad
Use el patrón Composite cuando la estructura de la disposición de poseer cualquier nivel de complejidad y sea dinámica, cuando se quiera manejar la estructura del elemento deforma uniforme usando métodos comunes, cuando exista un componente con estructura rama-hoja o parte=todo.
Implementación
El patrón Composite necesita de los siguientes elementos:
•    Component: La interfaz en la que se definen los métodos disponibles para todas las partes de la estructura.
•    Composite: Esta clase queda definida por los componentes que alberga; está compuesta por sus componentes.
•    Leaf: La clase que que implementa la interfaz Component y que proporciona una implementación para todos los métodos de Component, se diferencia de las clases Composite en que esta no tiene referencia a otros objetos Composite, entonces Leaf representa el nivel más bajo de la jerarquía.
Ventajas e Inconvenientes
Composite nos brinda una interfaz muy fácil de manejar además de proporcionar una gran flexibilidad en cuanto a estructura, permite llamar el mismo método en todos los componentes singulares sin darle mayor relevancia importancia al sitio actual sobre la estructura, el patrón Composite suele ser difícil de probar y depurar por causa de su gran flexibilidad, el uso de interfaces puede ser inconveniente cuando se pretenden definir atributos y se aspira proveer implementaciones por defecto para que los nodos hereden este comportamiento
Patrones Relacionados
•    Chain of responsability: Se emplea cuando hay que propagar los métodos hacia lo alto del árbol. 
•    Flyweight: Reutiliza cuando el numero de objetos tramitados producidos por el árbol es muy grande.
•    Iterator: Se usa para encapsular el recorrido del árbol.
•    Visitor: Facilita la centralización del comportamiento, porque de otra forma correspondería ser dividido entre las clases hoja y las ramas.


Decorator

Propósito
Permite implantar o eliminar añadir de manera cómoda y flexible una funcionalidad de un componente sin cambiar su apariencia externa o su funcionamiento
Aplicabilidad
Use el patrón Decorator cuando se facilite añadir o quitar funcionalidades de los componentes durante la ejecución, cuando existan características que cambien autónomamente, que se tienen que utilizar dinámicamente y que se consigan combinar caprichosamente sobre un componente, se quiera realizar cambios activamente que sean claros al usuario, sin las restricciones que acarrea crear subclases.
Implementación
El patrón Adapter necesita de los siguientes elementos:
•    Component: Representa el componente que contiene el comportamiento genérico.
•    Decorator: Define los comportamientos estándar que se esperan de todos los decoradores.
•    ConcreteDecorator: Cada subclase de Decorator necesita soportar modificaciones, cada Decorator puede definir mçetodos adicionales o también variables para ampliar el componente.
•    Adaptee: La interfaz que define los métodos que serán adaptados. Esta interfaz permite que se cargue dinámicamente el Adaptee específico en tiempo de ejecución.
•    ConcreteAdaptee: La implementación de la interfaz Adaptee. La clase que necesita ser adaptada para que pueda ser utilizada por el Framework.
Ventajas e Inconvenientes
Permite ajustar y ampliar el comportamiento de un objeto en tiempo de ejecución, además hace cómoda la ampliación del componente en el futuro ya que se pueden insertar los cambios por medio de nuevas clases.
La depuración y verificación se pueden hacer difíciles y la velocidad del sistema puede disminuir si el patrón Decorator no es bien diseñado.
Patrones Relacionados
•    Adapter: Esta diseñado para cambiar la interfaz conservando igual funcionalidad, en cambio Decorador no cambia la interfaz sino la funcionalidad. 
•    Composite: Decorator puede ser percibido como una adaptación más simple de Composite ya que en vez de poseer una recopilación de componentes, este tiene un máximo de una referencia a un componente tercero.


Facade

Propósito
Facilitar una interfaz sencilla para ser empleada por una agrupación de subsistemas o un sistema complejo.
Aplicabilidad
Use el patrón Adapter cuando se necesite disminuir el acoplamiento entre el subsistema y el cliente, cuando se vayan a implantar capas en los subsistemas proveyendo una fachada para cada conjunto de subsistemas, cuando se quiera facilitar el uso de sistemas complejos proporcionando una interfaz mucho más simple sin necesidad de quitar las elecciones avanzadas.
Implementación
El patrón Adapter necesita de los siguientes elementos:
•    Facade: La clase que utilizan los clientes. Conoce los subsistemas utilizados y sus respectivas responsabilidades.
•    Subsystem: Son conjutnos de clases. Pueden ser utilizados directamente por los clientes o hacer el trabajo asignado a ellos por el objeto Facade.
Ventajas e Inconvenientes
Facilita una interfaz mucho más sencilla para un sistema de aguda complejidad sin disminuir las opciones dadas por el conjunto del sistema y además la interfaz proporcionada resguarda a los clientes de la redundancia de opciones.
El patrón Facade lleva las peticiones del cliente hacia los subsistemas que intervendrán en el proceso.
Impulsa el bajo acoplamiento.
Patrones Relacionados
•    Abstract Factory: Para hacer más fácil el acceso a los objetos creados por la factoría, esta puede crear un objeto fachada para cada uno de ellos.
•    Mediator: Se parece mucho a Facade. Se diferencian en su intención y su implementación.
•    Singleton: Es usado por Facade para asegurar que se tenga un punto de acceso único y al mismo tiempo pueda ser accedido por un subsistema.


Flyweight

Propósito
Minimizar la cantidad de objetos detallados que poseen un bajo nivel en un sistema por medio de la cooperación de objetos.
Aplicabilidad
Use el patrón Adapter cuando se necesita diferenciar los objetos similares en su estado original para un grupo de clases y solo es posible saber en tiempo de ejecución que clases será utilizada, cuando la aplicación hace uso de diversos objetos semejantes, cuando los conjuntos de objetos parecidos pueden ser sustituidos por un objeto compartido una vez las piezas diferentes del estado ya se han descartado, cuando las partes diferentes se pueden aislar de las partes análogas en los objetos relacionados para facilitar la cooperación de esas piezas.
Implementación
El patrón Adapter necesita de los siguientes elementos:
•    Flyweight: Interfaz que define los métodos que pueden ser utilizados por los clientes para pasar el estado externo a los objetos flyweight.
•    ConcreteFlyweight: Implementa la interfaz Flyweight y tiene la capacidad de almacenar datos internos.
•    FlyweightFactory: La fabrica es el responsable de crear y manejar los objetos Flyweight.
•    Cliente: El cliente es el responsable de crear y proporcionar el contexto para los objetos Flyweight. La forma de obtener una referencia a un objeto Flyweight es por medio es por medio de FlyweightFactory.
Ventajas e Inconvenientes
Se reduce la cantidad de objetos que se deben gestionar, ahorrando mucho espacio en memoria.
Se economiza más espacio aún si la información de contexto de los objetos se computa en vez de tenerla almacenada, pero, eso nos produce el problema puntual de este patrón: El costo en el período de ejecución.
Patrones Relacionados
•    Abstract Factory: Se recurre a este patrón para hacer más dinámico el acceso a los objetos Flyweight.
•    Composite: Se suele utilizar este patrón para proporcionar la estructura.
•    State: Comúnmente se hace uso de Flyweight para implementar el patrón State.

Proxy

Propósito
Proporcionar un representante de un objeto, por causa de muchas razones como lo son el acceso, la velocidad y la seguridad.
Aplicabilidad
Use el patrón Adapter cuando se requiera una referencia mucho mas confeccionada que una referencia simple:
•    Proxy remoto: Cuando se requiera un representante a nivel local para un objeto en un espacio de direcciones diferente.
•    Proxy Virtual: Hace el papel de representante y difiere la creación de objetos costosos. 
•    Proxy protector: Instaura los derechos de acceso al objeto real.
Implementación
El patrón Adapter necesita de los siguientes elementos:
•    Service: La interfaz implementada por el proxy y por el objeto real.
•    ServiceProxy: Implementa la interfaz Service y redirige las llamadas de los métodos al objeto real (Servicelmpl)cuando sea apropiado.
•    Servicelmpl: la implementación real y completa de la intefaz. Este objeto estará representado por el objeto Proxy.
Ventajas e Inconvenientes
Varían de acuerdo al tipo de Proxy:
•    Proxy remoto: La red se puede ocultar al cliente. Un problema es que este patron como no sabe que esta actuando sobre una red puede no estar listo para las penalizaciones de tiempo.
•    Proxy Virtual: Tiene un sustituto con el cual puede interactuar y no se ve en la obligación de crear el producto real hasta que sea estrictamente necesario.
Hay que tener cuidado con la correcta correspondencia en la transferencia de argumentos entre el Framework y el Adaptee.
Patrones Relacionados
•    Adapter: Brinda una interfaz frontal de un objeto en particular la cual es diferente para cada objeto, en cambio el Proxy Proporciona la misma interfaz para el objeto.