Created
January 28, 2016 11:38
-
-
Save francoishill/9782b24920f78cff15e2 to your computer and use it in GitHub Desktop.
C# visitor pattern
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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