Patrón de Diseño Adapter en Go: Implementación Práctica
Clase 11 de 19 • Curso de Go Avanzado: Concurrencia y Patrones de Diseño
Contenido del curso
Concurrencia
- 2

Condiciones de Carrera en Programación Concurrente con Go
04:52 min - 3

Evitar Condiciones de Carrera en Go con Mutex y WaitGroup
11:26 min - 4

Lectura y Escritura Concurrente en Go con RWMutex
06:15 min - 5

Creación de un Sistema de Caché Concurrente en Go
14:29 min - 6

Manejo de Condiciones de Carrera en Go: Implementación de Mutex
08:52 min - 7

Cache concurrente en Go para cálculos intensivos de Fibonacci
16:31 min
Patrones de diseño
- 8

Patrones de Diseño en Programación Orientada a Objetos con Go
04:53 min - 9

Patrón de Diseño Factory en Go: Creación y Uso Práctico
15:17 min - 10

Implementación de Singleton en Go para Conexiones de Base de Datos
08:48 min - 11

Patrón de Diseño Adapter en Go: Implementación Práctica
Viendo ahora - 12

Patrón de Diseño Observer en Go: Implementación Práctica
11:59 min - 13

Implementación del Patrón de Diseño Strategy en Go
08:53 min
Net
- 14

Escaneo de Puertos TCP con Go: Introducción Básica
07:45 min - 15

Concurrencia en Go: Escáner de Puertos Eficiente y Personalizable
09:16 min - 16

Implementación de NetCAD como Cliente TCP en Go
10:14 min - 17

Construcción de Back End para Servidor de Chat en Go
16:08 min - 18

Implementación de un Servidor de Chat en Go con TCP
13:54 min
Conclusión
¿Qué es un patrón de diseño Adapter?
El patrón de diseño Adapter es un patrón estructural que sirve para resolver problemas de incompatibilidad entre interfaces y estructuras (structs) en programación. Este patrón actúa como un puente entre dos interfaces incompatibles, permitiendo que trabajen juntas sin necesidad de modificar el código existente o agregar líneas innecesarias. Esto es importante porque evita reescribir o refactorizar código que ya está bien definido y probado.
¿Cómo se implementa un Adapter en Go?
Para implementar un Adapter en el lenguaje de programación Go, seguiremos los pasos descritos en el siguiente ejemplo:
-
Definir la interfaz principal: Crear una interfaz que especifique el comportamiento deseado. Por ejemplo:
type Payment interface { Pay() } -
Crear un struct que implemente esta interfaz: Este struct debe tener la implementación necesaria para la interfaz:
type CashPayment struct{} func (c CashPayment) Pay() { fmt.Println("Pagando utilizando cash") } -
Añadir un nuevo struct con comportamiento diferente: Supongamos que se necesita un struct que requiere un parámetro adicional:
type BankPayment struct{} func (b BankPayment) Pay(accountNumber int) { fmt.Printf("Pay using bank account %d\n", accountNumber) } -
Crear un adapter para integrar el nuevo struct con la interfaz existente: Se crea un nuevo tipo que adaptará el comportamiento del struct al de la interfaz:
type BankPaymentAdapter struct { bankPayment BankPayment bankAccount int } func (bpa BankPaymentAdapter) Pay() { bpa.bankPayment.Pay(bpa.bankAccount) } -
Usar el adapter en lugar del nuevo struct cuando sea necesario: Finalmente, incluimos el Adapter en nuestro flujo para garantizar compatibilidad:
func main() { cash := CashPayment{} processPayment(cash) bankAdapter := BankPaymentAdapter{ bankPayment: BankPayment{}, bankAccount: 12345, } processPayment(bankAdapter) }
¿Cuál es la utilidad del patrón Adapter?
El uso de un Adapter tiene varias ventajas, entre las que destacan:
- Evitar rehacer el código existente: Adaptar un nuevo componente a una interfaz ya existente sin tener que cambiar el código preexistente.
- Reutilización de código: Permitir el uso de un código nuevo que no implementa interfaces determinadas, favoreciendo la cohesión y flexibilidad.
- Eliminación de redundancias: No será necesario crear métodos duplicados o redefinir interfaces específicas para cada nuevo comportamiento.
Implementar el patrón de diseño Adapter en las situaciones correctas puede simplificar significativamente tu código y mejorar la modularidad. Si todavía no has experimentado con este patrón, te animo a hacerlo. Comienza a adaptarlo en tus proyectos y observa cómo tu código se convierte en una solución más elegante y eficaz. ¡Sigue aprendiendo y explorando patrones de diseño que incrementarán tus habilidades de desarrollo!