访客模式示例

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

为什么这比仅仅放置一个公共财产歌曲然后让任何类别的人做任何它想做的更好?

这个例子来自这篇文章 。

这主要是因为该示例是访问者模式的一个不好的例子。 访问者模式的目的是为一组对象添加通用function,而不必从同一个类派生。 它允许您继续向类添加function,而无需自己更改类。 您引用的答案中较长的水果示例是对访客模式的更好解释。

阅读引用的维基百科文章,为了获得回报,您应该拥有一组课程。 在你的情况下,不同的类不是真正的保证,因此不需要访问者模式。 给定一个更加异构的类结构,访问者模式可能会变得有用。

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