【问题标题】:Example with Visitor Pattern访客模式示例
【发布时间】:2011-02-06 11:10:42
【问题描述】:
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 然后让任何类型的类做任何它想做的事情更好?

这个例子来自这个post

【问题讨论】:

    标签: c# design-patterns oop


    【解决方案1】:

    主要是因为这个例子是访问者模式的一个坏例子。访问者模式的目的是为一组对象添加通用功能,而不必从同一个类派生。它使您可以继续向类添加功能,而无需更改类本身。您引用的答案中较长的水果示例是对访问者模式的更好解释。

    阅读引用的维基百科文章,为访问者还清你应该有一组类。在您的情况下,实际上并不需要不同的类,因此不需要访问者模式。给定一个更加异构的类结构,访问者模式可能会变得有用。

    【讨论】:

      【解决方案2】:

      在我看来,这种模式的用处与 MusicLibrary 的实现有关。如上面最简单的形式所示,它只是将歌曲列表传递给 Visitor.Visit 方法。在更复杂的应用程序中,可能没有要公开的内存列表:例如,它可能必须搜索不同机器的库才能构建列表。我的观点——无论多么糟糕——是随着迭代歌曲的复杂性增加,该逻辑可以集中保存在 MusicLibrary 中,而 IMusicVisitor 对象可以只处理歌曲的集合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-30
        • 2019-08-05
        • 1970-01-01
        相关资源
        最近更新 更多