Adapter
Propósito
Según el libro "Patrones de Diseño" [29] el patrón Adapter "convierte la interfaz de una clase en otra interfaz que es la que esperan los clientes. Permite que cooperen clases que de otra forma no podrían por tener interfaces incompatibles".
También conocido como
Wrapper (Envoltorio)
Estructura

Participantes
Objetivo:
define la interfaz específica del dominio que usa el Cliente.
Cliente:
colabora con variables que se ajustan a la interfaz Objetivo.
Adaptable:
define una interfaz existente que necesita ser adaptada.
Adaptador:
adapta la interfaz de Adaptable a la interfaz Objetivo.
Implementación
No se observan impedimentos y/o modificaciones de la estructura original del patrón para su implementación en Go.
Código de ejemplo
En este ejemplo queremos que un juego de RPG se pueda adaptar a un nuevo tipo de personaje (Magos) que no comparte las mismas características que los guerreros originales (Elfos). Para esto es necesario realizar un adaptador para que un Mago pueda atacar como un Elfo.
Implementación:
// Objetivo
type Gerrero interface {
UsarArma() string
}
type Elfo struct{}
func (e *Elfo) UsarArma() string {
return "atacando con arco y flecha"
}
// Adaptable
type GerreroMagico interface {
UsarMagia() string
}
type Mago struct{}
func (m *Mago) UsarMagia() string {
return "atacando con magia"
}
// Adaptador
type MagoAdaptador struct {
gerrero GerreroMagico
}
func (ma *MagoAdaptador) UsarArma() string {
return ma.gerrero.UsarMagia()
}
// Cliente
type Jugador struct {
guerrero Gerrero
}
func (j *Jugador) Atacar() string {
return j.guerrero.UsarArma()
}
Se puede probar la implementación del patrón de la siguiente forma:
jugadorA := &Jugador{&Elfo{}}
fmt.Printf("Jugador A: %s\n", jugadorA.Atacar())
jugadorB := &Jugador{&MagoAdaptador{&Mago{}}}
fmt.Printf("Jugador B: %s\n", jugadorB.Atacar())
Código de ejemplo | Ejecutar código
Atención: Esta publicación se encuentra abandonada. Puede acceder a la versión vigente en https://leanpub.com/designpatternsingo
Última actualización
¿Te fue útil?