En ingeniería de software , el patrón de delegación es un patrón de diseño orientado a objetos que permite que la composición de objetos logre la misma reutilización de código que la herencia .
En la delegación, un objeto maneja una solicitud delegando a un segundo objeto (el delegado ). El delegado es un objeto auxiliar , pero con el contexto original . Con el soporte a nivel de lenguaje para la delegación, esto se hace implícitamente al hacer que self
en el delegado se haga referencia al objeto original (de envío), no al delegado (objeto receptor). En el patrón de delegado, esto se logra en cambio al pasar explícitamente el objeto original al delegado, como un argumento a un método. [1] "Delegación" se usa a menudo de manera vaga para referirse al concepto distinto de reenvío , donde el objeto de envío simplemente usa el miembro correspondiente en el objeto receptor, evaluado en el contexto del objeto receptor , no en el objeto original.
Este artículo utiliza "objeto emisor/objeto receptor" para los dos objetos, en lugar de "objeto receptor/delegado", enfatizando qué objetos envían y reciben la llamada de delegación, no la llamada original.
En la Introducción de Gamma et al. 1994, la delegación se define como:
La delegación es una forma de hacer que la composición sea tan poderosa para la reutilización como la herencia [Lie86, JZ91]. En la delegación, dos objetos están involucrados en el manejo de una solicitud: un objeto receptor delega operaciones a su delegado . Esto es análogo a las subclases que difieren las solicitudes a las clases padre. Pero con la herencia, una operación heredada siempre puede hacer referencia al objeto receptor a través de la
this
variable miembro en C++ yself
en Smalltalk. Para lograr el mismo efecto con la delegación, el receptor se pasa a sí mismo al delegado para permitir que la operación delegada haga referencia al receptor. [2]
En el siguiente ejemplo (usando el lenguaje de programación Kotlin ), la clase Window delega la area()
llamada a su objeto interno Rectangle (su delegado).
clase Rectángulo ( val ancho : Int , val alto : Int ) { fun area () = ancho * alto } clase Ventana ( val bounds : Rectángulo ) { // Delegación fun area () = bounds . area () }
Algunos lenguajes tienen incorporado un soporte especial para la delegación. Por ejemplo, en el lenguaje de programación Kotlin, la by
palabra clave [3] delega a la interfaz de otro objeto:
interfaz ClosedShape { área de diversión (): Int } clase Rectángulo ( val ancho : Int , val alto : Int ) : ClosedShape { anular fun area () = ancho * alto } // La implementación de ClosedShape de Window delega a la de Rectangle que tiene límites de la clase Window ( private val bounds : Rectangle ) : ClosedShape por límites