Adapter Pattern - lenoryv/Design-Patterns GitHub Wiki
Patrón Adapter en Kotlin
¡El patrón del adaptador es básicamente un adaptador! En la vida real usamos adaptadores para conectar entre dos objetos cuando necesitamos sacar ventaja de uno de ellos y no es compatible con el segundo, por ejemplo el adaptador que solía conectar entre enchufe y enchufe con diferente diseño. Ahora veamos el adaptador en el mundo del software. The Gang of Four define la intención del adaptador en el libro de patrones de diseño como:
Convierta la interfaz de una clase en otra interfaz que esperan los clientes. El adaptador permite que las clases trabajen juntas que de otra manera no podrían debido a interfaces incompatibles. De acuerdo con esta definición, si su cliente trata con clases que tienen una interfaz específica y necesita usar una clase existente con una interfaz diferente que no es compatible con el cliente, entonces puede usar la clase de adaptador para envolver la clase existente y hacerla compatible. con el cliente sin realizar ningún cambio en la clase existente o el cliente. Para ilustrar, veamos un ejemplo.
Si tenemos una aplicación que convierte cualquier moneda a USD y necesitamos usar una nueva biblioteca que convierte monedas a EUR y supongamos que la nueva biblioteca usa códigos ISO para definir monedas. Pero en nuestra aplicación necesitamos pasar el nombre del país que usa esta moneda. En este caso podemos ajustar la biblioteca o el cliente para que sean compatibles. Pero los nuevos cambios pueden causar algunos problemas. Otro problema al que nos enfrentaremos es que es posible que no podamos cambiar el código fuente de la nueva biblioteca.
El patrón de adaptador en esta situación puede asumir un papel principal al definir una clase que hereda la interfaz del cliente y la nueva biblioteca para que sea compatible con cada una de ellas y será responsable de cualquier traducción y conversión necesaria entre el cliente y la nueva biblioteca. Entonces tomará la solicitud del cliente y preparará el código ISO de la moneda del país solicitado y lo pasará a la biblioteca. Por lo tanto, esta clase envuelve la nueva biblioteca y agrega su característica al cliente sin que ninguna parte sepa lo que está sucediendo.
Estructura del patrón Adapter
La nueva clase, la interfaz del cliente y la nueva biblioteca se denominan Adapter, Target y Adaptee respectivamente. El siguiente diagrama UML muestra la estructura del patrón del adaptador
Target:
Define la interfaz específica del dominio que utiliza el Cliente.
Adaptee:
Define una interfaz existente que necesita adaptarse.
Adapter:
Adapta la interfaz de Adaptee a la interfaz de Target.
En realidad, el ejemplo anterior describe un tipo de adaptador, un adaptador de clase que hereda la interfaz adaptee y la adapta a la interfaz de destino, hay otro tipo llamado adaptador de objeto que define un objeto adaptado y lo usa sin necesidad de heredar ninguna clase adaptee. Cada tipo tiene sus pros y sus contras. Un adaptador de clase tiene la capacidad de anular el comportamiento de Adaptee ya que es una subclase de Adaptee pero, por otro lado, restringe la clase principal de adaptación, y sus subclases necesitarán otros adaptadores para trabajar con ellos. Viceversa, un adaptador de objeto puede funcionar con Adaptee y todas sus subclases y tiene la capacidad de agregarles funcionalidad a la vez, pero al mismo tiempo no puede anular el comportamiento de Adaptee, por lo que no hay un tipo mejor, solo depende de su situación y lo que necesita y qué idioma utiliza.
El siguiente diagrama ilustra la estructura del adaptador de objetos