Beispiel mit Besucher-Muster
public class Song {
public string Genre { get; protected set; }
public string Name { get; protected set; }
public string Band { get; protected set; }
public Song(string name, string band, string genre) {
Name = name;
Genre = genre;
Band = band;
}
}
public interface IMusicVisistor
{
void Visit(List<Song> items);
}
public class MusicLibrary {
List<Song> _songs = new List<Song> { ...songs ... };
public void Accept(IMusicVisitor visitor) {
visitor.Visit(_songs);
}
}
und nun, hier ist ein Besucher, den ich gemacht:
public class RockMusicVisitor : IMusicVisitor {
public List<Song> Songs { get; protected set; }
public void Visit(List<Song> items) {
Songs = items.Where(x => x.Genre == "Rock").ToList();
}
}
Warum ist dies besser als nur darum, eine öffentliche Eigenschaft-Songs, und dann lassen jede Art von Klasse zu tun alles, was es will?
Diesem Beispiel kommt von dieser post.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es vor allem, weil das Beispiel ist ein schlechtes Beispiel für die Besucher-Muster. Der Zweck des visitor pattern ist es, Allgemeine Funktionen hinzufügen, um eine Gruppe von Objekten, die zimmerreserviereung, ohne das Sie stammen aus der gleichen Klasse. Sie können Sie halten das hinzufügen von Funktionalität zu Klassen ohne änderung der Klassen selbst. Die mehr Obst Beispiel in der Antwort, die du zitiert hast, ist eine bessere Erklärung des visitor pattern.
Lesen Sie die zitierten wikipedia-Artikel, für den Besucher auszahlen sollten Sie eine Gruppe von Klassen. Im Fall der verschiedenen Klassen sind nicht wirklich gerechtfertigt, so gibt es keine Notwendigkeit für den Besucher-Muster. Angesichts heterogener Klassenstruktur der Besucher Muster könnten nützlich werden.
Meiner Meinung nach, dieses Muster durch seine Nützlichkeit zu tun hat mit der Umsetzung der MusicLibrary. Wie oben gezeigt, in seiner einfachsten form, es ist nur auf der Durchreise in die Liste der songs, die in die Besucher.Besuchen Methode. In einer komplexeren Anwendung könnte es nicht sein, eine in-memory-Liste zu setzen: zum Beispiel könnte es haben, durchforsten Sie die Bibliotheken von verschiedenen Maschinen nur zum Aufbau der Liste. Mein Punkt ist - aber schlecht gemacht - ist, dass die Komplexität der Iteration Songs erhöht, dass die Logik gehalten werden kann, zentral in der MusicLibrary, und IMusicVisitor Objekte können nur befassen sich mit Sammlungen von Songs.