Odwiedzający (ang. Visitor) (wzorzec behawioralny) ma za zadanie odsperować implementację algorytmu od struktury istniejących klas bez konieczności modyfikacji ich bieżącego kodu. Klasy rozszerzone o nową funkcjonalność akceptują obiekt Odwiedzającego (parametr implementowanej metody) i przenoszą na niego odpowiedzialność realizacji zadania. Obiekt Odwiedzający dostarcza implementacje algorytmu zgodnie z typem obiektu Odwiedzonego, który został przekazany jako parametr (double dispatch). Dodanie funkcjonalności do klas wymaga minimalnego nakładu zmian bez modyfikacji ich aktualnej struktury oraz logiki, a implementacja obiektów Odwiedzających może być wymienna.
Ograniczenia
Należy unikać stosowania wzorca w przypadku niestabilnej, często zmieniającej się struktury i hierarchii klas, ponieważ zmiany te pociągają za sobą modyfikację klas Odwiedzających. Co więcej wzorzec narusza hermetyzację komponentów.
Użycie
Odwiedzający ma zastosowanie w sytuacjach, gdy wymagane jest dodanie funkcjonalności dla zbioru klas, a modyfikacja struktury istniejących klas jest utrudniona lub niedozwolona.
Implementacja
Klasy które wymagają rozszerzenia o nową funkcjonalność implementują interfejs Element. W metodzie akceptującej wizytację obiektu typu Visitor, przekazują referencje do własnej instancji i delegują wykonanie zadania obiektowi Odwiedzającemu. Klasy obiektów Odwiedzających implementują interfejs Visitor, dostarczając realizację tego samego zadania dla różnych typów obiektów Odwiedzanych.
Poniższy listing przedstawia wizytację obiektów typu Visitor dla klas typu Element.
Klient dokonuje realizacji zadania poprzez wybór obiektu Odwiedzającego i wywołaniu metody akceptacji dla kolekcji elementów Odwiedzanych.
Przykład
Księgarnia korzysta z oprogramowania Bookstore, które umożliwia zarządzanie aktualnym stanem zbiorów książek, filmów oraz gier komputerowych. Księgarnia chciałaby umożliwić czytelnikom sprawdzanie stanu swoich dostępnych zasobów przez internet. Ponadto dział techniczny zgłosił potrzebę dostępu do informacji o zasobach księgarni w formacie json. Ze względu na brak finansów oraz czasu niezbędnych do przetestowania potencjalnych zmian, dyrektor działu technicznego nie wyraził zgody na silną modyfikacje bieżącego kodu. Z myślą o niskim koszcie modyfikacji oraz rozszerzeniu generowanych plików o nowy format, programista podjął decyzję o wykorzystaniu wzorca Odwiedzający. Poniższy listing przedstawia zmiany dokonane w bieżącym kodzie poprzez implementacje interfejsu Product w klasach zasobów.
Implementacja sposobu generowania plików została stworzona poza bieżącym kodem co prezentuje poniższy listing.
Dział techniczny korzystając z modyfikacji oprogramowania generuje pliki html oraz json dla wybranych zasobów.
Biblioteki
Przykładem biblioteki implementującej wzorzec Odwiedzający są klasy ElementVisitor oraz Element (ze standardowego pakietu Java). Ze względu na ich generyczność, mogą być z powodzeniem zastosowane w wielu przypadkach bez konieczności tworzenia własnych interfejsów.