Treci la conținutul principal

Ce este

Șablonul Adaptor (Adapter) face ca o clasă cu o interfață nepotrivită să se potrivească interfeței pe care o așteaptă codul tău — ca un adaptor de priză de călătorie între o priză străină și încărcătorul tău.

Nu poți modifica vechea clasă (vine dintr-o bibliotecă sau alt cod depinde de ea). Așa că o învelești într-o clasă mică, care implementează protocolul de care ai nevoie și traduce apelurile.


Exemplu: o imprimantă veche folosită ca logger

Codul nostru vrea un Logger cu log(message). Clasa veche oferă doar write_line(prefix, text). Adaptorul păstrează clasa veche și traduce un apel în celălalt.

Adaptorul traduce apelul

run() funcționează cu orice Logger; adaptorul transformă imprimanta veche într-unul dintre ei, fără să-i atingă codul.

Prompt
Scrie un program Python cu un protocol Logger (metoda log) pe care îl așteaptă funcția noastră run, o clasă LegacyPrinter cu o altă metodă write_line(prefix, text) care nu poate fi modificată și o clasă PrinterAdapter care respectă protocolul, traducând apelul log în write_line. Rulează serviciul cu adaptorul.
Ieșire: program Python complet
The adapter translates the call

Când să-l folosești

Folosește-l 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ă) modifici niciuna dintre părți — biblioteci externe, cod vechi, cod generat.

Renunță la el când ambele părți îți aparțin — atunci modifică pur și simplu una dintre ele ca să se potrivească. Un adaptor între două clase pe care le controlezi este o soluție ocolitoare pentru o decizie pe care ai putea-o lua direct.


Avantaje și dezavantaje

Avantaje: codul vechi și cel nou colaborează fără modificări în niciunul dintre ele; traducerea se află într-o singură clasă mică, ușor de testat.

Dezavantaje: încă un pas prin care trebuie să treci când citești codul; multe adaptoare puse unul peste altul sunt un semn că interfețele însele trebuie refăcute.