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.
Ieșire: script PHP
<?php
// Interfața pe care o așteaptă codul nostru.
interface Logger {
public function log(string $message): void;
}
// O clasă veche de bibliotecă, cu o metodă diferită — nu o putem modifica.
class LegacyPrinter {
public function writeLine(string $prefix, string $text): void {
echo $prefix . " | " . $text, "\n";
}
}
// Adaptorul face ca vechea clasă să se potrivească noii interfețe.
class PrinterAdapter implements Logger {
public function __construct(private LegacyPrinter $legacy) {}
public function log(string $message): void {
$this->legacy->writeLine("LOG", $message);
}
}
function run(Logger $l): void {
$l->log("serviciu pornit");
$l->log("cerere procesată");
}
run(new PrinterAdapter(new LegacyPrinter()));
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.