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
items); } public class MusicLibrary { List _songs = new List { ...songs ... }; public void Accept(IMusicVisitor visitor) { visitor.Visit(_songs); } } и теперь вот один Посетитель, которого я сделал:
public class RockMusicVisitor : IMusicVisitor { public List
Songs { get; protected set; } public void Visit(List items) { Songs = items.Where(x => x.Genre == "Rock").ToList(); } } Почему это - немного лучше, чем просто помещение общественной собственности Песни и затем разрешение какому-либо виду класса сделать с ним что-нибудь, что это хочет?
Этот пример прибывает из этого сообщения.
Это главным образом потому, что этот пример является плохим примером шаблона посетителя. Целью шаблона посетителя является добавление общих функций к группе объектов без необходимости быть производным от одного и того же класса. Это позволяет вам продолжать добавлять функциональные возможности к классам, не изменяя сами классы. Более длинный пример фруктов в ответе, который вы процитировали, лучше объясняет шаблон посетителя.
Прочтите процитированную статью в Википедии, чтобы посетитель расплатился, у вас должна быть группа занятий. В вашем случае разные классы на самом деле не нужны, поэтому шаблон посетителя не нужен. При более неоднородной структуре классов шаблон посетителя может оказаться полезным.
На мой взгляд, полезность этого шаблона связана с реализацией MusicLibrary. Как показано выше в самой простой форме, он просто передает список песен в метод Visitor.Visit. В более сложном приложении может не быть списка в памяти, который нужно раскрыть: например, ему, возможно, придется просмотреть библиотеки разных машин, чтобы создать список. Моя точка зрения - как бы плохо она ни была сформулирована - заключается в том, что по мере увеличения сложности итерации Песен эта логика может храниться централизованно в MusicLibrary, а объекты IMusicVisitor могут иметь дело только с коллекциями Песен.