Skip to content

Instantly share code, notes, and snippets.

@francoishill
Created January 28, 2016 11:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save francoishill/9782b24920f78cff15e2 to your computer and use it in GitHub Desktop.
Save francoishill/9782b24920f78cff15e2 to your computer and use it in GitHub Desktop.
C# visitor pattern
public abstract class BaseAnimal
{
public abstract void Accept(IAnimalVisitor visitor);
}
public class DogAnimal : BaseAnimal
{
public string MoveHeadStepName = "Dog move head";
public string WagTailStepName = "Dog wag tail";
public string OpenMouthStepName = "Dog open mouth";
public string CloseMouthStepName = "Dog close mouth";
public override void Accept(IAnimalVisitor visitor)
{
visitor.Visit(this);
}
}
public class CatAnimal : BaseAnimal
{
public string OpenMouthStepName = "Cat open mouth";
public string CloseMouthStepName = "Cat close mouth";
public override void Accept(IAnimalVisitor visitor)
{
visitor.Visit(this);
}
}
public interface IAnimalVisitor
{
void Dispatch<T>(IEnumerable<T> animals) where T : BaseAnimal;
void Visit(DogAnimal animal);
void Visit(CatAnimal animal);
}
public abstract class AbstractAnimalVisitor : IAnimalVisitor
{
public void Dispatch<T>(IEnumerable<T> animals) where T : BaseAnimal
{
foreach (var animal in animals)
{
animal.Accept(this);
}
}
public abstract void Visit(DogAnimal animal);
public abstract void Visit(CatAnimal animal);
}
public class CollectStepsAnimalVisitor : AbstractAnimalVisitor
{
public List<string> Steps = new List<string>();
public override void Visit(DogAnimal animal)
{
Steps.Add(animal.MoveHeadStepName);
Steps.Add(animal.WagTailStepName);
Steps.Add(animal.OpenMouthStepName);
Steps.Add(animal.CloseMouthStepName);
}
public override void Visit(CatAnimal animal)
{
Steps.Add(animal.OpenMouthStepName);
Steps.Add(animal.CloseMouthStepName);
}
}
public void UsageExample()
{
var animals = new List<BaseAnimal>()
{
new CatAnimal(),
new DogAnimal()
};
var visitor = new CollectStepsAnimalVisitor();
visitor.Dispatch(animals);
var allSteps = visitor.Steps;
foreach (var step in allSteps)
{
Console.WriteLine("STEP: " + step);
}
}
public abstract class BaseAnimal
{
public abstract void Accept(IAnimalVisitor visitor);
}
public class DogAnimal : BaseAnimal
{
public void Bark()
{
Console.WriteLine("Dog barking");
}
public override void Accept(IAnimalVisitor visitor)
{
visitor.Visit(this);
}
}
public class CatAnimal : BaseAnimal
{
public void Meow()
{
Console.WriteLine("Cat meowing");
}
public override void Accept(IAnimalVisitor visitor)
{
visitor.Visit(this);
}
}
public interface IAnimalVisitor
{
void Visit(DogAnimal animal);
void Visit(CatAnimal animal);
}
public class MakeSoundAnimalVisitor : IAnimalVisitor
{
public void Visit(DogAnimal animal)
{
animal.Bark();
}
public void Visit(CatAnimal animal)
{
animal.Meow();
}
}
public void UsageExample()
{
var animal = new CatAnimal();
var visitor = new MakeSoundAnimalVisitor();
animal.Accept(visitor);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment