Ce este
Șablonul Adapter face ca un tip cu interfața greșită să se potrivească interfeței pe care o așteaptă codul tău — la fel ca un adaptor de călătorie între o priză străină și încărcătorul tău.
Nu poți schimba tipul vechi (vine dintr-o bibliotecă sau alt cod depinde de el). Așa că îl învelești într-un tip mic ce implementează interfața de care ai nevoie și traduce apelurile.
Exemplu: o imprimantă veche folosită ca Logger
Codul nostru vrea un Logger cu Log(message). Tipul vechi oferă doar WriteLine(prefix, text). Adaptorul ține tipul vechi și traduce un apel în celălalt.
Adaptorul traduce apelul
run() lucrează cu orice Logger; adaptorul face din imprimanta veche unul dintre ei, fără să îi atingă codul.
Ieșire: program Go și rezultatul capturat
package main
import "fmt"
// Interfața pe care o așteaptă codul nostru.
type Logger interface {
Log(message string)
}
// Un tip vechi dintr-o bibliotecă, cu o metodă diferită — nu îl putem modifica.
type LegacyPrinter struct{}
func (LegacyPrinter) WriteLine(prefix, text string) {
fmt.Println(prefix + " | " + text)
}
// Adaptorul face ca tipul vechi să se potrivească cu interfața nouă.
type PrinterAdapter struct {
legacy LegacyPrinter
}
func (a PrinterAdapter) Log(message string) {
a.legacy.WriteLine("LOG", message)
}
func run(l Logger) {
l.Log("serviciul a pornit")
l.Log("cerere procesată")
}
func main() {
run(PrinterAdapter{legacy: LegacyPrinter{}})
}
Când să îl folosești
Folosește-l atunci când un cod care funcționează și o interfață de care ai nevoie nu se potrivesc, iar tu nu poți (sau nu ar trebui) să schimbi niciuna dintre părți — biblioteci terțe, cod moștenit, cod generat.
Evită-l atunci când deții ambele părți — în acest caz schimbă pur și simplu una dintre ele ca să se potrivească. Un adaptor între două tipuri pe care le controlezi este o soluție de ocolire pentru o decizie pe care ai putea să o iei direct.
Avantaje și dezavantaje
Avantaje: codul vechi și cel nou colaborează fără modificări de nicio parte; traducerea stă într-un singur tip mic, ușor de testat.
Dezavantaje: încă un pas de parcurs la citire; multe adaptoare stivuite unele peste altele sunt un semn că interfețele în sine au nevoie de o revizuire.