Eg. Code 1:
//
Visitor pattern -- Structural example
using System;
using System.Collections;
// "Visitor"
abstract class Visitor
... {
// Methods
abstract public void VisitConcreteElementA(
ConcreteElementA concreteElementA);
abstract public void VisitConcreteElementB(
ConcreteElementB concreteElementB);
}
// "ConcreteVisitor1"
class ConcreteVisitor1 : Visitor
... {
// Methods
override public void VisitConcreteElementA(
ConcreteElementA concreteElementA)
...{
Console.WriteLine("{0} visited by {1}",
concreteElementA, this);
}
override public void VisitConcreteElementB(
ConcreteElementB concreteElementB)
...{
Console.WriteLine("{0} visited by {1}",
concreteElementB, this);
}
}
// "ConcreteVisitor2"
class ConcreteVisitor2 : Visitor
... {
// Methods
override public void VisitConcreteElementA(
ConcreteElementA concreteElementA)
...{
Console.WriteLine("{0} visited by {1}",
concreteElementA, this);
}
override public void VisitConcreteElementB(
ConcreteElementB concreteElementB)
...{
Console.WriteLine("{0} visited by {1}",
concreteElementB, this);
}
}
// "Element"
abstract class Element
... {
// Methods
abstract public void Accept(Visitor visitor);
}
// "ConcreteElementA"
class ConcreteElementA : Element
... {
// Methods
override public void Accept(Visitor visitor)
...{
visitor.VisitConcreteElementA(this);
}
public void OperationA()
...{
}
}
// "ConcreteElementB"
class ConcreteElementB : Element
... {
// Methods
override public void Accept(Visitor visitor)
...{
visitor.VisitConcreteElementB(this);
}
public void OperationB()
...{
}
}
// "ObjectStructure"
class ObjectStructure
... {
// Fields
private ArrayList elements = new ArrayList();
// Methods
public void Attach(Element element)
...{
elements.Add(element);
}
public void Detach(Element element)
...{
elements.Remove(element);
}
public void Accept(Visitor visitor)
...{
foreach (Element e in elements)
e.Accept(visitor);
}
}
/**/ /**/
/**/ /// <summary>
/// Client test
/// </summary>
public class Client
... {
public static void Main(string[] args)
...{
// Setup structure
ObjectStructure o = new ObjectStructure();
o.Attach(new ConcreteElementA());
o.Attach(new ConcreteElementB());
// Create visitor objects
ConcreteVisitor1 v1 = new ConcreteVisitor1();
ConcreteVisitor2 v2 = new ConcreteVisitor2();
// Structure accepting visitors
o.Accept(v1);
o.Accept(v2);
}
}
using System;
using System.Collections;
// "Visitor"
abstract class Visitor
... {
// Methods
abstract public void VisitConcreteElementA(
ConcreteElementA concreteElementA);
abstract public void VisitConcreteElementB(
ConcreteElementB concreteElementB);
}
// "ConcreteVisitor1"
class ConcreteVisitor1 : Visitor
... {
// Methods
override public void VisitConcreteElementA(
ConcreteElementA concreteElementA)
...{
Console.WriteLine("{0} visited by {1}",
concreteElementA, this);
}
override public void VisitConcreteElementB(
ConcreteElementB concreteElementB)
...{
Console.WriteLine("{0} visited by {1}",
concreteElementB, this);
}
}
// "ConcreteVisitor2"
class ConcreteVisitor2 : Visitor
... {
// Methods
override public void VisitConcreteElementA(
ConcreteElementA concreteElementA)
...{
Console.WriteLine("{0} visited by {1}",
concreteElementA, this);
}
override public void VisitConcreteElementB(
ConcreteElementB concreteElementB)
...{
Console.WriteLine("{0} visited by {1}",
concreteElementB, this);
}
}
// "Element"
abstract class Element
... {
// Methods
abstract public void Accept(Visitor visitor);
}
// "ConcreteElementA"
class ConcreteElementA : Element
... {
// Methods
override public void Accept(Visitor visitor)
...{
visitor.VisitConcreteElementA(this);
}
public void OperationA()
...{
}
}
// "ConcreteElementB"
class ConcreteElementB : Element
... {
// Methods
override public void Accept(Visitor visitor)
...{
visitor.VisitConcreteElementB(this);
}
public void OperationB()
...{
}
}
// "ObjectStructure"
class ObjectStructure
... {
// Fields
private ArrayList elements = new ArrayList();
// Methods
public void Attach(Element element)
...{
elements.Add(element);
}
public void Detach(Element element)
...{
elements.Remove(element);
}
public void Accept(Visitor visitor)
...{
foreach (Element e in elements)
e.Accept(visitor);
}
}
/**/ /**/
/**/ /// <summary>
/// Client test
/// </summary>
public class Client
... {
public static void Main(string[] args)
...{
// Setup structure
ObjectStructure o = new ObjectStructure();
o.Attach(new ConcreteElementA());
o.Attach(new ConcreteElementB());
// Create visitor objects
ConcreteVisitor1 v1 = new ConcreteVisitor1();
ConcreteVisitor2 v2 = new ConcreteVisitor2();
// Structure accepting visitors
o.Accept(v1);
o.Accept(v2);
}
}
Eg. Code 2:
using
System;
using System.Collections;
// "Visitor"
abstract class Visitor
... {
// Methods
abstract public void Visit(Element element);
}
// "ConcreteVisitor1"
class IncomeVisitor : Visitor
... {
// Methods
public override void Visit(Element element)
...{
Employee employee = ((Employee)element);
// Provide 10% pay raise
employee.Income *= 1.10;
Console.WriteLine("{0}'s new income: {1:C}",
employee.Name, employee.Income);
}
}
// "ConcreteVisitor2"
class VacationVisitor : Visitor
... {
public override void Visit(Element element)
...{
Employee employee = ((Employee)element);
// Provide 3 extra vacation days
employee.VacationDays += 3;
Console.WriteLine("{0}'s new vacation days: {1}",
employee.Name, employee.VacationDays);
}
}
// "Element"
abstract class Element
... {
// Methods
abstract public void Accept(Visitor visitor);
}
// "ConcreteElement"
class Employee : Element
... {
// Fields
string name;
double income;
int vacationDays;
// Constructors
public Employee(string name, double income,
int vacationDays)
...{
this.name = name;
this.income = income;
this.vacationDays = vacationDays;
}
// Properties
public string Name
...{
get ...{ return name; }
set ...{ name = value; }
}
public double Income
...{
get ...{ return income; }
set ...{ income = value; }
}
public int VacationDays
...{
get ...{ return vacationDays; }
set ...{ vacationDays = value; }
}
// Methods
public override void Accept(Visitor visitor)
...{
visitor.Visit(this);
}
}
// "ObjectStructure"
class Employees
... {
// Fields
private ArrayList employees = new ArrayList();
// Methods
public void Attach(Employee employee)
...{
employees.Add(employee);
}
public void Detach(Employee employee)
...{
employees.Remove(employee);
}
public void Accept(Visitor visitor)
...{
foreach (Employee e in employees)
e.Accept(visitor);
}
}
/**/ /**/
/**/ /// <summary>
/// VisitorApp test
/// </summary>
public class VisitorApp
... {
public static void Main(string[] args)
...{
// Setup employee collection
Employees e = new Employees();
e.Attach(new Employee("Hank", 25000.0, 14));
e.Attach(new Employee("Elly", 35000.0, 16));
e.Attach(new Employee("Dick", 45000.0, 21));
// Create two visitors
IncomeVisitor v1 = new IncomeVisitor();
VacationVisitor v2 = new VacationVisitor();
// Employees are visited
e.Accept(v1);
e.Accept(v2);
}
}
using System.Collections;
// "Visitor"
abstract class Visitor
... {
// Methods
abstract public void Visit(Element element);
}
// "ConcreteVisitor1"
class IncomeVisitor : Visitor
... {
// Methods
public override void Visit(Element element)
...{
Employee employee = ((Employee)element);
// Provide 10% pay raise
employee.Income *= 1.10;
Console.WriteLine("{0}'s new income: {1:C}",
employee.Name, employee.Income);
}
}
// "ConcreteVisitor2"
class VacationVisitor : Visitor
... {
public override void Visit(Element element)
...{
Employee employee = ((Employee)element);
// Provide 3 extra vacation days
employee.VacationDays += 3;
Console.WriteLine("{0}'s new vacation days: {1}",
employee.Name, employee.VacationDays);
}
}
// "Element"
abstract class Element
... {
// Methods
abstract public void Accept(Visitor visitor);
}
// "ConcreteElement"
class Employee : Element
... {
// Fields
string name;
double income;
int vacationDays;
// Constructors
public Employee(string name, double income,
int vacationDays)
...{
this.name = name;
this.income = income;
this.vacationDays = vacationDays;
}
// Properties
public string Name
...{
get ...{ return name; }
set ...{ name = value; }
}
public double Income
...{
get ...{ return income; }
set ...{ income = value; }
}
public int VacationDays
...{
get ...{ return vacationDays; }
set ...{ vacationDays = value; }
}
// Methods
public override void Accept(Visitor visitor)
...{
visitor.Visit(this);
}
}
// "ObjectStructure"
class Employees
... {
// Fields
private ArrayList employees = new ArrayList();
// Methods
public void Attach(Employee employee)
...{
employees.Add(employee);
}
public void Detach(Employee employee)
...{
employees.Remove(employee);
}
public void Accept(Visitor visitor)
...{
foreach (Employee e in employees)
e.Accept(visitor);
}
}
/**/ /**/
/**/ /// <summary>
/// VisitorApp test
/// </summary>
public class VisitorApp
... {
public static void Main(string[] args)
...{
// Setup employee collection
Employees e = new Employees();
e.Attach(new Employee("Hank", 25000.0, 14));
e.Attach(new Employee("Elly", 35000.0, 16));
e.Attach(new Employee("Dick", 45000.0, 21));
// Create two visitors
IncomeVisitor v1 = new IncomeVisitor();
VacationVisitor v2 = new VacationVisitor();
// Employees are visited
e.Accept(v1);
e.Accept(v2);
}
}