Пример с шаблоном "посетитель"

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

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

Этот пример прибывает из этого сообщения.

8
задан Community 23 May 2017 в 10:29
поделиться

2 ответа

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

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

10
ответ дан 5 December 2019 в 15:21
поделиться

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

1
ответ дан 5 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: