El patrón de diseño Proxy es una técnica comúnmente utilizada en programación orientada a objetos para proporcionar una interfaz de acceso a un objeto real.
Esto se logra mediante la creación de un objeto “proxy” que actúa como intermediario entre el usuario y el objeto real, permitiendo controlar y manipular el acceso a ese objeto.
Ejemplo Proxy 1: Calculadora
En Kotlin, podemos implementar el patrón de diseño Proxy utilizando la palabra clave by
en la declaración de una interfaz. Por ejemplo, si tenemos una interfaz llamada Calculator
que tiene un método llamado sum
:
interface Calculator { fun sum(a: Int, b: Int): Int }
Podemos crear una clase llamada CalculatorProxy
que implemente esta interfaz y actúe como intermediario para el objeto real que hace la operación de suma:
class CalculatorProxy(private val realCalculator: Calculator) : Calculator by realCalculator
En este caso, la clase CalculatorProxy
está delegando la implementación del método sum
al objeto realCalculator
, que es el objeto real que hará la operación de suma.
De esta manera, podemos controlar el acceso a la operación de suma a través del objeto CalculatorProxy
, permitiendo por ejemplo validar los parámetros de entrada o realizar algún tipo de cálculo adicional antes de delegar la operación al objeto real.
Ejemplo Proxy 2: Servidor remoto
Otro ejemplo de utilización del patrón de diseño Proxy en Kotlin puede ser el acceso a un servicio remoto. Supongamos que tenemos una interfaz llamada RemoteService
que tiene un método llamado getData()
:
interface RemoteService { fun getData(id: Int): String }
Podemos crear una clase llamada RemoteServiceProxy
que implemente esta interfaz y actúe como intermediario para el objeto real que hace la llamada al servicio remoto:
class RemoteServiceProxy(private val realRemoteService: RemoteService) : RemoteService by realRemoteService
En este caso, la clase RemoteServiceProxy
está delegando la implementación del método “obtenerDatos” al objeto realRemoteService
, que es el objeto real que hace la llamada al servicio remoto.
De esta manera, podemos controlar el acceso a la llamada al servicio remoto a través del objeto RemoteServiceProxy
, permitiendo por ejempl
o realizar validaciones de seguridad antes de delegar la llamada al objeto real.
Además, el patrón de diseño Proxy también nos permite implementar caché en la respuesta del servicio remoto, evitando realizar llamadas innecesarias si ya se ha obtenido previamente la misma información.
Conclusión
En resumen, el patrón de diseño Proxy nos permite proporcionar una interfaz de acceso controlado a un objeto real, permitiendo implementar funcionalidades adicionales como validaciones de seguridad o caché de respuestas.
Esto puede ser muy útil en diferentes escenarios, como en el acceso a servicios remotos o en la implementación de lógica de negocio compleja.
En Kotlin, podemos implementar el patrón de diseño Proxy utilizando la palabra clave by
en la declaración de una interfaz, delegando la implementación de sus métodos a un objeto real.