REBAJA de primavera
Adapter

Adapter en Go

Adapter es un patrón de diseño estructural que permite colaborar a objetos incompatibles.

El patrón Adapter actúa como envoltorio entre dos objetos. Atrapa las llamadas a un objeto y las transforma a un formato y una interfaz reconocible para el segundo objeto.

Ejemplo conceptual

Tenemos un código cliente que espera ciertas funciones de un objeto (puerto Lightning), pero tenemos otro objeto llamado adaptee (portátil Windows), que ofrece la misma funcionalidad pero a través de una interfaz diferente (puerto USB).

Aquí es donde el patrón Adapter entra en escena. Creamos un tipo de estructura conocido como adapter que:

  • Se adherirá a la misma interfaz que espera el cliente (puerto Lightning).

  • Traducirá la solicitud del cliente al objeto adaptado en la forma que éste espera. El adaptador acepta un conector Lightning y después traduce sus señales a un formato USB y las pasa al puerto USB en el portátil Windows.

client.go: Código cliente

package main

import "fmt"

type Client struct {
}

func (c *Client) InsertLightningConnectorIntoComputer(com Computer) {
	fmt.Println("Client inserts Lightning connector into computer.")
	com.InsertIntoLightningPort()
}

computer.go: Interfaz de cliente

package main

type Computer interface {
	InsertIntoLightningPort()
}

mac.go: Servicio

package main

import "fmt"

type Mac struct {
}

func (m *Mac) InsertIntoLightningPort() {
	fmt.Println("Lightning connector is plugged into mac machine.")
}

windows.go: Servicio desconocido

package main

import "fmt"

type Windows struct{}

func (w *Windows) insertIntoUSBPort() {
	fmt.Println("USB connector is plugged into windows machine.")
}

windowsAdapter.go: Adaptador

package main

import "fmt"

type WindowsAdapter struct {
	windowMachine *Windows
}

func (w *WindowsAdapter) InsertIntoLightningPort() {
	fmt.Println("Adapter converts Lightning signal to USB.")
	w.windowMachine.insertIntoUSBPort()
}

main.go

package main

func main() {

	client := &Client{}
	mac := &Mac{}

	client.InsertLightningConnectorIntoComputer(mac)

	windowsMachine := &Windows{}
	windowsMachineAdapter := &WindowsAdapter{
		windowMachine: windowsMachine,
	}

	client.InsertLightningConnectorIntoComputer(windowsMachineAdapter)
}

output.txt: Resultado de la ejecución

Client inserts Lightning connector into computer.
Lightning connector is plugged into mac machine.
Client inserts Lightning connector into computer.
Adapter converts Lightning signal to USB.
USB connector is plugged into windows machine.

Adapter en otros lenguajes

Adapter en C# Adapter en C++ Adapter en Java Adapter en PHP Adapter en Python Adapter en Ruby Adapter en Rust Adapter en Swift Adapter en TypeScript