Wzorzec projektowy odwiedzający - visitor

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3331 razy

Opis wzorca projektowego odwiedzający

Wzorzec projektowy odwiedzający należy do czynnościowych wzorców projektowych. Jego celem jest oddzielenie algorytmu od obiektu, na którym ów algorytm jest realizowany.

Przykładowy diagram UML wzorca projektowego odwiedzający

Na poniższym diagramie UML klasy Comment i Code dziedziczące po interfejsie iText mają zaimplementowaną metodę write, która to przyjmuje jako argument interfejs iCode. Interfejs ten jest dziedziczony przez klasy VBCode i CppCode mające zaimplementowaną metodę write w wersji przyjmującej jako argument referencje do obiektu klasy Code oraz w wersji przyjmującej jako argument obiekt klasy Comment. Interfejs iCode odwiedza obiekt klasy VBCode lub CppCode w celu wyświetlenia informacji w nim zawartych.

Przykładowy diagram UML dla wzorca projektowego odwiedzający
Rys. 1
Przykładowy diagram UML dla wzorca projektowego odwiedzający

Przykładowa implementacja wzorca projektowego odwiedzający w C++

#include <iostream> #include <string> #include <vector> class Code; class Comment; class iCode{ public: virtual void write(Code &code) = 0; virtual void write(Comment &comment) = 0; virtual ~iCode(){} }; class iText{ protected: std::string text; public: iText(std::string text) : text(text){} inline std::string getText() { return text; } virtual void write(iCode* icode) = 0; virtual ~iText(){} }; class Code : public iText{ public: Code(std::string text) : iText(text){} virtual void write(iCode* icode){ icode->write(*this); } }; class Comment : public iText{ public: Comment(std::string text) : iText(text){} virtual void write(iCode* icode){ icode->write(*this); } }; class VBCode : public iCode{ public: virtual void write(Code &code){ std::cout << "VB code: " << code.getText() << std::endl; } virtual void write(Comment &comment){ std::cout << "VB comment: " << comment.getText() << std::endl; }; }; class CppCode : public iCode{ virtual void write(Code &code){ std::cout << "C++ code: " << code.getText() << std::endl; } virtual void write(Comment &comment){ std::cout << "C++ comment: " << comment.getText() << std::endl; }; }; int main(){ std::vector<iText*> text; text.push_back(new Comment("This is a line of comment in C++")); text.push_back(new Code("int x = 0;")); CppCode cppcode; for(int i = 0; i < text.size(); i++){ text[i]->write(&cppcode); } while(!text.empty()){ delete text.back(); text.pop_back(); } text.push_back(new Comment("This is a line of comment in VB")); text.push_back(new Code("Dim x As Integer;")); VBCode vbcode; for(int i = 0; i < text.size(); i++){ text[i]->write(&vbcode); } while(!text.empty()){ delete text.back(); text.pop_back(); } std::cin.get(); return 0; }

Wynik działania powyższego kodu:

C++ comment: This is a line of comment in C++
C++ code: int x = 0;
VB comment: This is a line of comment in VB
VB code: Dim x As Integer;
Strony powiązane
strony powiązane
  1. sourcemaking.com/design_patterns/visitor - strona opisująca wzorzec projektowy odwiedzający [En]
  2. pl.wikipedia.org - opis tego wzorca na stronie Wikipedii
Propozycje książek
tytuł: C++. Projektowanie oprogramowania. Zasady i wzorce projektowe autor: Klaus Iglberger

Tytuł:

C++. Projektowanie oprogramowania. Zasady i wzorce projektowe

Autor:

Klaus Iglberger

tytuł: Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II autor: Eric Freeman, Elisabeth Robson

Tytuł:

Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II

Autor:

Eric Freeman, Elisabeth Robson

tytuł: React 17. Wzorce projektowe i najlepsze praktyki. Projektowanie i rozwijanie nowoczesnych aplikacji internetowych. Wydanie III autor: Carlos Santana Roldán

Tytuł:

React 17. Wzorce projektowe i najlepsze praktyki. Projektowanie i rozwijanie nowoczesnych aplikacji internetowych. Wydanie III

Autor:

Carlos Santana Roldán

tytuł: Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II autor: Eric Freeman, Elisabeth Robson

Tytuł:

Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II

Autor:

Eric Freeman, Elisabeth Robson

tytuł: Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F# autor: Dmitri Nesteruk

Tytuł:

Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#

Autor:

Dmitri Nesteruk

tytuł: Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku autor: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

Tytuł:

Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku

Autor:

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

tytuł: Projektowanie interfejsów., Sprawdzone wzorce projektowe. Wydanie III autor: Jenifer Tidwell, Charles Brewer, Aynne Valencia-Brooks

Tytuł:

Projektowanie interfejsów., Sprawdzone wzorce projektowe. Wydanie III

Autor:

Jenifer Tidwell, Charles Brewer, Aynne Valencia-Brooks

tytuł: Kubernetes. Wzorce projektowe. Komponenty wielokrotnego użycia do projektowania natywnych aplikacji chmurowych autor: Bilgin Ibryam,  Roland Huß

Tytuł:

Kubernetes. Wzorce projektowe. Komponenty wielokrotnego użycia do projektowania natywnych aplikacji chmurowych

Autor:

Bilgin Ibryam, Roland Huß

tytuł: Wzorce projektowe w .NET. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F# autor: Dmitri Nesteruk

Tytuł:

Wzorce projektowe w .NET. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#

Autor:

Dmitri Nesteruk

tytuł: Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II autor: Alan Shalloway, James R. Trott

Tytuł:

Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II

Autor:

Alan Shalloway, James R. Trott

W związku z tym, że firma Helion nie wywiązuje się z swoich zobowiązań naliczania prowizji za każdą zakupioną książkę a kontakt z ową frmą jest nie możliwy autor strony zmuszony został do zablokowania linkowania książek. Za wszelkie niedogodności z tym związane z góry przepraszam i obiecuję włączenie linkowania gdy tylko sprawa zostanie wyjaśniona