Basierend auf der hervorragenden Antwort von @Federico A. Ramponi.
Stellen Sie sich vor, Sie haben diese Hierarchie:
public interface IAnimal
{
void DoSound();
}
public class Dog : IAnimal
{
public void DoSound()
{
Console.WriteLine("Woof");
}
}
public class Cat : IAnimal
{
public void DoSound(IOperation o)
{
Console.WriteLine("Meaw");
}
}
Was passiert, wenn Sie hier eine "Walk"-Methode hinzufügen müssen? Das wäre für den gesamten Entwurf schmerzhaft.
Gleichzeitig wirft das Hinzufügen der "Walk"-Methode neue Fragen auf. Was ist mit "Fressen" oder "Schlafen"? Müssen wir wirklich für jede neue Aktion oder Operation, die wir hinzufügen wollen, eine neue Methode zur Tierhierarchie hinzufügen? Das ist unschön und vor allem können wir die Animal-Schnittstelle nie schließen. Mit dem Besucher-Muster können wir also neue Methoden zur Hierarchie hinzufügen, ohne die Hierarchie zu verändern!
Prüfen Sie also einfach dieses C#-Beispiel und führen Sie es aus:
using System;
using System.Collections.Generic;
namespace VisitorPattern
{
class Program
{
static void Main(string[] args)
{
var animals = new List<IAnimal>
{
new Cat(), new Cat(), new Dog(), new Cat(),
new Dog(), new Dog(), new Cat(), new Dog()
};
foreach (var animal in animals)
{
animal.DoOperation(new Walk());
animal.DoOperation(new Sound());
}
Console.ReadLine();
}
}
public interface IOperation
{
void PerformOperation(Dog dog);
void PerformOperation(Cat cat);
}
public class Walk : IOperation
{
public void PerformOperation(Dog dog)
{
Console.WriteLine("Dog walking");
}
public void PerformOperation(Cat cat)
{
Console.WriteLine("Cat Walking");
}
}
public class Sound : IOperation
{
public void PerformOperation(Dog dog)
{
Console.WriteLine("Woof");
}
public void PerformOperation(Cat cat)
{
Console.WriteLine("Meaw");
}
}
public interface IAnimal
{
void DoOperation(IOperation o);
}
public class Dog : IAnimal
{
public void DoOperation(IOperation o)
{
o.PerformOperation(this);
}
}
public class Cat : IAnimal
{
public void DoOperation(IOperation o)
{
o.PerformOperation(this);
}
}
}