Treci la conținutul principal

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 modifica 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 ține clasa veche și traduce un apel în celălalt.

Adaptorul traduce apelul

run() lucrează cu orice Logger; adaptorul face din imprimanta moștenită unul dintre ele, fără să-i atingă codul.

Prompt
Scrie un script PHP cu o interfață Logger (metoda log) pe care o așteaptă funcția noastră run, o clasă 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 cu adaptorul.
Ieșire: script PHP
The adapter translates the call

Când se folosește

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ă modifici niciuna dintre părți — biblioteci terțe, cod moștenit, cod generat.

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


Avantaje și dezavantaje

Avantaje: codul vechi și cel nou cooperează fără modificări de nicio parte; traducerea stă într-o singură clasă mică, ușor de testat.

Dezavantaje: încă un nivel de parcurs la citire; multe adaptoare stivuite unele peste altele sunt un semn că interfețele însele trebuie refăcute.