Code in C#:
namespace
Visitor_DesignPattern
{
using System;
abstract class Visitor
{
abstract public void VisitElementA(ConcreteElementA a);
abstract public void VisitElementB(ConcreteElementB b);
}
class ConcreteVisitor1 : Visitor
{
override public void VisitElementA(ConcreteElementA a)
{
}
override public void VisitElementB(ConcreteElementB b)
{
}
}
abstract class Element
{
abstract public void Accept(Visitor v);
}
class ConcreteElementA : Element
{
public Visitor myVisitor;
override public void Accept(Visitor v)
{
myVisitor = v;
}
public void OperationA()
{
}
public void DoSomeWork()
{
// do some work here
// . . .
// Get visitor to visit
myVisitor.VisitElementA(this);
// do some more work here
// . . .
}
}
class ConcreteElementB : Element
{
override public void Accept(Visitor v)
{
}
public void OperationB()
{
}
}
///<summary>
/// Summary description for Client.
///</summary>
public class Client
{
public static int Main(string[] args)
{
ConcreteElementA eA = new ConcreteElementA();
ConcreteElementB eB = new ConcreteElementB();
ConcreteVisitor1 v1 = new ConcreteVisitor1();
eA.Accept(v1);
eA.DoSomeWork();
return 0;
}
}
}
Code in SOME:
AVisitor
a_VisitElementA(CConcreteElementA a)
a_VisitElementB(CConcreteElementB b)
CConcreteVisitor1:AVisitor
o_VisitElementA(CConcreteElementA a)
o_VisitElementB(CConcreteElementB b)
AElement
a_Accept(AVisitor v)
CConcreteElementA :AElement, ->AVisitor[m_myVisitor]
o_Accept(AVisitor)
OperatorA()
DoSomeWork()
CConcreteElementB: AElement
o_Accept(AVisitor m_myVisitor)
OperationB()
CClient
main
CClient.main
{
CConcreteElementA eA.();
CConcreteElementB eB.();
CConcreteVisitor1 v1.();
//eA.Accept(v1)
//{
// m_myVisitor = v1;
//};
eA.Accept(m_myVisitor = v1);
eA.DoSomeWork()
{
m_myVisitor.VisitElementA(eA); //"m_myVisitor.VisitElementA(this)"
};
}