Ce este
Șablonul Adapter face ca o clasă cu interfața greșită să se potrivească interfeței pe care o așteaptă codul tău — ca un adaptor de călătorie între o priză străină și încărcătorul tău.
Nu poți schimba clasa veche (vine dintr-o bibliotecă sau alt cod depinde de ea). Așa că o învelești într-o clasă 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). Clasa moștenită oferă doar writeLine(prefix, text). Adaptorul păstrează obiectul vechi și traduce un apel în celălalt.
Adaptorul traduce apelul
run() funcționează cu orice Logger; adaptorul face ca imprimanta moștenită să fie unul dintre ele, fără a-i atinge codul. Ambele linii afișate încep cu LOG | — acel prefix este furnizat de adaptor, nu de apelant.
Ieșire: program TypeScript și rezultatul capturat
// Interfața pe care o așteaptă codul nostru.
interface Logger {
log(message: string): void
}
// O clasă veche de bibliotecă, cu o metodă diferită — nu o putem schimba.
class LegacyPrinter {
writeLine(prefix: string, text: string): void {
console.log(prefix + " | " + text)
}
}
// Adaptorul face ca vechea clasă să se potrivească interfeței de care avem nevoie.
class PrinterAdapter implements Logger {
private legacy: LegacyPrinter
constructor(legacy: LegacyPrinter) {
this.legacy = legacy
}
log(message: string): void {
this.legacy.writeLine("LOG", message)
}
}
function run(logger: Logger): void {
logger.log("serviciu pornit")
logger.log("cerere procesată")
}
run(new PrinterAdapter(new LegacyPrinter()))
Când să îl folosești
Folosește-l atunci când un cod funcțional și o interfață necesară 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.
Renunță la el atunci când deții ambele părți — în acest caz schimb-o pur și simplu pe una dintre ele ca să se potrivească. Un adaptor între două clase pe care le controlezi este o soluție de ocolire a unei decizii pe care ai putea pur și simplu să o iei.
Avantaje și dezavantaje
Avantaje: codul vechi și cel nou cooperează fără modificări de nicio parte; traducerea trăiește într-o singură clasă mică, ușor de testat.
Dezavantaje: încă un pas de parcurs la citire; multe adaptoare stivuite unul peste altul sunt un semn că interfețele în sine au nevoie de o refacere.