Monday, June 13, 2011

Visitor Pattern

Leave a Comment
What is a visitor pattern?
  • The visitor pattern is a behavioral design pattern. 

  • This pattern allows to seperate the data structures and the algorithms to be applied on the data.

  • Both data structure objects and algorithm objects can evolve seperately. Makes development and changes easier.

  • Data structure (element) objects have an "accept" method which take in a visitor (algorithmic) object.

  • Algorithmic objects have a "visit" method which take in a data structure object.



EXAMPLE:- Demonstrate a simple visitor pattern using C++

#include <iostream>

#include <list>

using namespace std;



// Forwards

class VisitorIntf;



// Abstract interface for Element objects

class ElementIntf

{

public:

virtual string name() = 0;

virtual void accept(VisitorIntf* object) = 0;

};



// Abstract interface for Visitor objects

class VisitorIntf

{

public:

virtual void visit(ElementIntf* object) = 0;

};



// Concrete element object

class ConcreteElement1 : public ElementIntf

{

public:

string name()

{

return "ConcreteElement1";

}



void accept(VisitorIntf *object)

{

object->visit(this);

}

};





// Concrete element object

class ConcreteElement2 : public ElementIntf

{

public:

string name()

{

return "ConcreteElement2";

}



void accept(VisitorIntf *object)

{

object->visit(this);

}

};



// Visitor logic 1

class ConcreteVisitor1 : public VisitorIntf

{

public:

void visit(ElementIntf *object)

{

cout << "Visited " << object->name() <<

" using ConcreteVisitor1." << endl;

}

};



// Visitor logic 2

class ConcreteVisitor2 : public VisitorIntf

{

public:

void visit(ElementIntf *object)

{

cout << "Visited " << object->name() <<

" using ConcreteVisitor2." << endl;

}

};



// Test main program

int main()

{

list<ElementIntf*> elementList1;

elementList1.push_back(new ConcreteElement1());

elementList1.push_back(new ConcreteElement2());



VisitorIntf* visitor1 = new ConcreteVisitor1();

while ( ! elementList1.empty() )

{

ElementIntf* element = elementList1.front();

element->accept(visitor1);

elementList1.pop_front();

}



list<ElementIntf*> elementList2;

elementList2.push_back(new ConcreteElement1());

elementList2.push_back(new ConcreteElement2());

VisitorIntf* visitor2 = new ConcreteVisitor2();

while ( ! elementList2.empty() )

{

ElementIntf* element = elementList2.front();

element->accept(visitor2);

elementList2.pop_front();

}



delete visitor1;

delete visitor2;

}



OUTPUT:-

Visited ConcreteElement1 using ConcreteVisitor1.

Visited ConcreteElement2 using ConcreteVisitor1.

Visited ConcreteElement1 using ConcreteVisitor2.

Visited ConcreteElement2 using ConcreteVisitor2.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment