[{"@context":"http:\/\/schema.org\/","@type":"BlogPosting","@id":"https:\/\/wiki.edu.vn\/pl\/wiki\/2021\/03\/02\/odwiedzajacy-wikipedia-wolna-encyklopedia\/#BlogPosting","mainEntityOfPage":"https:\/\/wiki.edu.vn\/pl\/wiki\/2021\/03\/02\/odwiedzajacy-wikipedia-wolna-encyklopedia\/","headline":"Odwiedzaj\u0105cy \u2013 Wikipedia, wolna encyklopedia","name":"Odwiedzaj\u0105cy \u2013 Wikipedia, wolna encyklopedia","description":"Z Wikipedii, wolnej encyklopedii Odwiedzaj\u0105cy (wizytator) \u2013 wzorzec projektowy, kt\u00f3rego zadaniem jest odseparowanie algorytmu od struktury obiektowej na kt\u00f3rej operuje.","datePublished":"2021-03-02","dateModified":"2021-03-02","author":{"@type":"Person","@id":"https:\/\/wiki.edu.vn\/pl\/wiki\/author\/lordneo\/#Person","name":"lordneo","url":"https:\/\/wiki.edu.vn\/pl\/wiki\/author\/lordneo\/","image":{"@type":"ImageObject","@id":"https:\/\/secure.gravatar.com\/avatar\/c9645c498c9701c88b89b8537773dd7c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c9645c498c9701c88b89b8537773dd7c?s=96&d=mm&r=g","height":96,"width":96}},"publisher":{"@type":"Organization","name":"Enzyklop\u00e4die","logo":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":600,"height":60}},"image":{"@type":"ImageObject","@id":"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/f\/f9\/Visitor.pattern.png\/420px-Visitor.pattern.png","url":"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/f\/f9\/Visitor.pattern.png\/420px-Visitor.pattern.png","height":"341","width":"420"},"url":"https:\/\/wiki.edu.vn\/pl\/wiki\/2021\/03\/02\/odwiedzajacy-wikipedia-wolna-encyklopedia\/","wordCount":3396,"articleBody":"Z Wikipedii, wolnej encyklopedii Odwiedzaj\u0105cy (wizytator) \u2013 wzorzec projektowy, kt\u00f3rego zadaniem jest odseparowanie algorytmu od struktury obiektowej na kt\u00f3rej operuje. Praktycznym rezultatem tego odseparowania jest mo\u017cliwo\u015b\u0107 dodawania nowych operacji do aktualnych struktur obiekt\u00f3w bez konieczno\u015bci ich modyfikacji. We wzorcu projektowym wprowadzony zostaje nowy typ obiektu Wizytator, kt\u00f3rego zadaniem jest “odwiedzenie” ka\u017cdego elementu w danej strukturze obiekt\u00f3w i wykonanie na nim konkretnych dzia\u0142a\u0144. R\u00f3\u017cne implementacje wizytator\u00f3w mog\u0105 wykonywa\u0107 r\u00f3\u017cne zadania, rozszerzaj\u0105c funkcjonalno\u015b\u0107 struktury element\u00f3w bez ich wewn\u0119trznej modyfikacji. Diagram UML dla wzorca projektowego “Odwiedzaj\u0105cy”Idea wzorca polega na stworzeniu interfejsu odwiedzaj\u0105cego (Visitor) zawieraj\u0105cego metody wirtualne Visit dla ka\u017cdej z implementacji element\u00f3w (dziedzicz\u0105cych po klasie Element) w zadanej strukturze obiekt\u00f3w.Ka\u017cdy odwiedzaj\u0105cy jest “przyjmowany” przez dany element poprzez metod\u0119 Accept – dla poszczeg\u00f3lnych implementacji obiekt\u00f3w Element, wo\u0142ane s\u0105 odpowiednie metody Visit w interfejsie Visitor odwiedzaj\u0105cego. R\u00f3\u017cne implementacje interfejsu Visitor mog\u0105 zawiera\u0107 (hermetyzowa\u0107) r\u00f3\u017cne funkcjonalno\u015bci dla ca\u0142ych struktur danych (sk\u0142adaj\u0105cych si\u0119 z obiekt\u00f3w Element). Obiekty tego typu reprezentuj\u0105 algorytmy wykonuj\u0105ce zadane czynno\u015bci na ka\u017cdym obiekcie osobno.Dla zbioru obiekt\u00f3w odwiedzanych metoda Accept powinna by\u0107 wywo\u0142ywana w odpowiedniej kolejno\u015bci, gwarantuj\u0105c, i\u017c ka\u017cdy element zostanie odwiedzony w odpowiednim momencie. Przyk\u0142adowo, wizytator odwiedzaj\u0105cy w\u0119z\u0142y w drzewie powinien by\u0107 akceptowany w kolejnych potomkach ka\u017cdego z w\u0119z\u0142\u00f3w, za\u015b wizytator odwiedzaj\u0105cy list\u0119 mo\u017ce by\u0107 wo\u0142any kolejno dla poszczeg\u00f3lnych element\u00f3w.Wzorzec wizytatora mo\u017ce by\u0107 zastosowany przy implementacji drzewa wyprowadzenia w parserach lub kompilatorach. Niech analizator sk\u0142adniowy zwr\u00f3ci struktur\u0119 danych, b\u0119d\u0105c\u0105 drzewem wyprowadzenia danego na wej\u015bcie wyra\u017cenia matematycznego. Drzewo to symbolizuje budow\u0119 semantyczn\u0105 pewnej formu\u0142y matematycznej i sk\u0142ada si\u0119 z dw\u00f3ch rodzaj\u00f3w w\u0119z\u0142\u00f3w:ArgumentNode – sta\u0142a warto\u015b\u0107 numeryczna w wyra\u017ceniu, np. “1.0”.OperatorNode – operator binarny w wyra\u017ceniu; przyjmuje za argumenty prawy i lewy w\u0119ze\u0142 potomny, np. “1.0 + 2.0”.Aby wykona\u0107 szereg operacji na ca\u0142ym drzewie, takich jak np. translacja wyra\u017cenia do Odwrotnej Notacji Polskiej lub kalkulacja wyra\u017cenia, trzeba dla ka\u017cdego z w\u0119z\u0142\u00f3w drzewa zaimplementowa\u0107 metody wykonuj\u0105ce powy\u017csze zadania. Utrzymanie i stworzenie tak rozwini\u0119tego kodu dla ka\u017cdej z klas reprezentuj\u0105cych w\u0119ze\u0142 w drzewie mo\u017ce by\u0107 do\u015b\u0107 skomplikowane. Aby unikn\u0105\u0107 takich sytuacji, mo\u017cna wykorzysta\u0107 wzorzec wizytatora.Niech obiekty, b\u0119d\u0105ce w\u0119z\u0142ami w drzewie, zawieraj\u0105 metod\u0119 Accept, w tre\u015bci kt\u00f3rej odwiedzaj\u0105cy b\u0119dzie przyjmowany kolejno w lewym i prawym dziecku oraz w samym w\u0119\u017ale. Ca\u0142a funkcjonalno\u015b\u0107 wykonywana na drzewie mo\u017ce by\u0107 zaimplementowana w r\u00f3\u017cnych wizytatorach (implementuj\u0105cych interfejs Visitor):PostfixPrintVisitor – wizytator odpowiedzialny za przet\u0142umaczenie wyra\u017cenia matematycznego do postaci Odwrotnej Notacji Polskiej.CalculationVisitor – wizytator odpowiedzialny za obliczenie wyra\u017cenia matematycznego. Wizytator u\u017cywa stosu zawieraj\u0105cego warto\u015bci numeryczne; na stosie odk\u0142adane s\u0105 obliczone wyniki dla ka\u017cdego z w\u0119z\u0142\u00f3w reprezentuj\u0105cego operacje matematyczn\u0105.Poni\u017cej zamieszczono przyk\u0142adowy kod w C++ obrazuj\u0105cy dzia\u0142anie opisanych wizytator\u00f3w:struct Node{ Node *Left, *Right; virtual void Accept( Visitor *v ) = 0;};struct ArgumentNode : public Node{ double Argument; virtual void Accept( Visitor *v ) { v->VisitArgumentNode( this ); }};struct OperatorNode : public Node{ char Operator; virtual void Accept( Visitor *v ) { if ( Left != NULL ) Left->Accept( v ); if ( Right != NULL ) Right->Accept( v ); v->VisitOperatorNode( this ); }};struct Visitor{ virtual void VisitArgumentNode( ArgumentNode *n ) = 0; virtual void VisitOperatorNode( OperatorNode *n ) = 0;};struct PostfixPrintVisitor : public Visitor{ String Output; virtual void VisitArgumentNode( ArgumentNode *n ) { Output += ToString( n->Argument ); } virtual void VisitOperatorNode( OperatorNode *n ) { Output += n->Operator; }};struct CalculationVisitor : public Visitor{ stack NumericStack; virtual void VisitArgumentNode( ArgumentNode *n ) { NumericStack.push( n->Argument ); } virtual void VisitOperatorNode( OperatorNode *n ) { Numeric b = NumericStack.top(); NumericStack.pop(); Numeric a = NumericStack.top(); NumericStack.pop(); switch ( n->Operator ) { case '+': NumericStack.push( a + b ); break; case '-': NumericStack.push( a - b ); break; case '*': NumericStack.push( a * b ); break; case '\/': NumericStack.push( a \/ b ); break; } }};Node *root = GetParseTree();PostfixPrintVisitor *printVisitor = new PostfixPrintVisitor;root->Accept( printVisitor );Print( \"Postfix notation: \" + printVisitor->Output );CalculationVisitor *calcVisitor = new CalculationVisitor;root->Accept( calcVisitor );Print( \"Result: \" + calcVisitor->NumericStack.top() );Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley Longman Publishing Co. Inc., 1994."},{"@context":"http:\/\/schema.org\/","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/wiki.edu.vn\/pl\/wiki\/#breadcrumbitem","name":"Enzyklop\u00e4die"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/wiki.edu.vn\/pl\/wiki\/2021\/03\/02\/odwiedzajacy-wikipedia-wolna-encyklopedia\/#breadcrumbitem","name":"Odwiedzaj\u0105cy \u2013 Wikipedia, wolna encyklopedia"}}]}]