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.
Ieșire: program Python complet
from typing import Protocol
# Protocolul pe care îl așteaptă codul nostru.
class Logger(Protocol):
def log(self, message: str) -> None: ...
# O clasă veche dintr-o bibliotecă, cu o altă metodă — nu o putem modifica.
class LegacyPrinter:
def write_line(self, prefix: str, text: str) -> None:
print(prefix + " | " + text)
# Adaptorul face ca vechea clasă să se potrivească noului protocol.
class PrinterAdapter:
def __init__(self, legacy: LegacyPrinter):
self.legacy = legacy
def log(self, message: str) -> None:
self.legacy.write_line("JURNAL", message)
def run(logger: Logger) -> None:
logger.log("serviciul a pornit")
logger.log("cererea a fost procesată")
run(PrinterAdapter(LegacyPrinter()))
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.