Treci la conținutul principal

Ce este

Șablonul Visitor adaugă o operație nouă unei familii de clase fără a le modifica. Clasele învață un singur lucru, o singură dată — accept(visitor) — iar de atunci înainte fiecare operație nouă este doar un vizitator nou, cu câte o metodă pentru fiecare clasă.

Inversează schimbul obișnuit: adăugarea de operații devine ușoară, iar adăugarea de clase devine schimbarea costisitoare.


Exemplu: operații peste forme

Formele nu se mai schimbă niciodată. Afișarea ariilor este un vizitator, denumirea lor este altul — iar un vizitator de export în SVG, mâine, nu ar atinge nici Circle, nici Rectangle.

Operații noi, clase neatinse

Ambii vizitatori parcurg același tablou de forme prin aceeași ușă accept: primul afișează aria cercului: 12.57 și aria dreptunghiului: 12.00, al doilea afișează cele două nume. Fiecare vizitator ține operația întreagă într-un singur loc, în loc să o împrăștie prin clase.

Prompt
Scrie un program TypeScript cu șablonul Visitor: clasele Circle și Rectangle cu o metodă accept, o interfață ShapeVisitor cu visitCircle și visitRectangle, un vizitator AreaPrinter care afișează aria fiecărei forme cu două zecimale și un vizitator NamePrinter care afișează numele fiecărei forme. Parcurge un tablou de forme cu ambii vizitatori.
Ieșire: program TypeScript și rezultatul capturat

Când să îl folosești

Folosește-l atunci când o familie stabilă de clase primește tot mereu operații noi — compilatoare care vizitează arbori de sintaxă, documente care capătă exportatoare, forme care capătă randatoare și instrumente de măsurare.

Evită-l atunci când familia încă crește: fiecare clasă nouă obligă la o schimbare în fiecare vizitator. În multe programe TypeScript un switch peste o uniune discriminată face aceeași treabă cu mai puțină mașinărie — apelează la vizitator atunci când se înmulțesc operațiile, nu clasele.


Avantaje și dezavantaje

Avantaje: operațiile întregi stau fiecare într-o singură clasă; operațiile noi nu cer nicio schimbare în clasele vizitate; logica înrudită nu mai este împrăștiată.

Dezavantaje: dubla dispecerizare (accept care apelează înapoi) îi încurcă pe începători; adăugarea unei singure clase vizitate înseamnă modificarea fiecărui vizitator; interfața familiei vizitate este înghețată devreme.