using System;
using System.Collections.Generic;
namespace TestCSharp
{
class Program
{
static void Main(string[] args)
{
Map map = new Map(new Girl());
map.Process(new ClassRoom());
map.Process(new Outdoor());
map = new Map(new Boy());
map.Process(new ClassRoom());
map.Process(new Outdoor());
Console.ReadKey();
}
abstract class AccessibleElement
{
public abstract void Accept(PersonVisitor visitor);
}
class ClassRoom : AccessibleElement
{
public override void Accept(PersonVisitor visitor)
{
visitor.Visit(this);
}
}
class Outdoor : AccessibleElement
{
public override void Accept(PersonVisitor visitor)
{
visitor.Visit(this);
}
}
abstract class PersonVisitor
{
public abstract void Visit(ClassRoom element);
public abstract void Visit(Outdoor element);
}
class Girl : PersonVisitor
{
public override void Visit(ClassRoom element)
{
Console.WriteLine("Study");
}
public override void Visit(Outdoor element)
{
Console.WriteLine("Talk");
}
}
class Boy : PersonVisitor
{
public override void Visit(ClassRoom element)
{
Console.WriteLine("Sleep");
}
public override void Visit(Outdoor element)
{
Console.WriteLine("Play basketball");
}
}
class Map
{
PersonVisitor m_Visitor;
public Map(PersonVisitor vistor)
{
m_Visitor = vistor;
}
public void Process(AccessibleElement element)
{
element.Accept(m_Visitor);
}
}
}
}