Пример с шаблоном посетителя - PullRequest
8 голосов
/ 10 апреля 2010
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);
    }
}

и вот один посетитель, которого я сделал:

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();
    }
}

Почему это лучше, чем просто разместить публичную собственность Songs и затем позволить любому классу делать с ней все, что захочет?

Этот пример взят из этой записи .

Ответы [ 2 ]

10 голосов
/ 10 апреля 2010

Это в основном потому, что пример является плохим примером шаблона посетителя. Целью шаблона посетителя является добавление общей функциональности к группе объектов без необходимости наследования от одного и того же класса. Это позволяет вам продолжать добавлять функциональность в классы без необходимости изменять сами классы. Более длинный пример фруктов в ответе, который вы цитировали, является лучшим объяснением модели посетителей.

Прочитайте цитируемую статью в Википедии, чтобы посетитель рассчитался, у вас должна быть группа занятий. В вашем случае разные классы на самом деле не гарантированы, поэтому нет необходимости в шаблоне посетителя. Учитывая более разнородную структуру классов, шаблон посетителя может стать полезным.

1 голос
/ 10 апреля 2010

На мой взгляд, полезность этого паттерна связана с реализацией MusicLibrary. Как показано выше в простейшей форме, он просто передает список песен в метод Visitor.Visit. В более сложном приложении может не отображаться список в памяти: например, ему может понадобиться просмотреть библиотеки разных машин только для создания списка. Моя точка зрения - как бы плохо это ни звучало - заключается в том, что по мере увеличения сложности итерации песен эта логика может храниться централизованно в MusicLibrary, а объекты IMusicVisitor могут работать только с коллекциями песен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...