Treci la conținutul principal

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.

Prompt
Scrie un program Go cu o interfață Logger (metoda Log) pe care o așteaptă funcția noastră run, un LegacyPrinter cu o metodă diferită WriteLine(prefix, text) care nu poate fi modificată și un PrinterAdapter care implementează Logger traducând apelul către WriteLine. Rulează serviciul folosind adaptorul.
Ieșire: program Go și rezultatul capturat
The adapter translates the call

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.