2010-04-10 67 views
8
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(); 
    } 
} 

爲什麼這比任何只是把公共財產的歌曲,然後讓任何類型的類用它做什麼都好,它想要?

本示例來自於此post

回答

10

這主要是因爲這個例子是訪問者模式的一個壞例子。訪問者模式的目的是爲一組對象添加通用功能,而不必從同一類派生。它可以讓你不斷地爲類添加功能,而無需自己修改類。您引用的答案中較長的水果示例是對訪問者模式的更好解釋。

閱讀引用的維基百科文章,訪問者還清你應該有一組班。在你的情況下,不同的課程並不真正保證,所以不需要訪問者模式。鑑於更多異構的類結構,訪問者模式可能會變得有用。

1

在我看來,這種模式的實用性與MusicLibrary的實現有關。如上所示,它是最簡單的形式,它只是將歌曲列表傳遞到Visitor.Visit方法中。在一個更復雜的應用程序中,可能沒有內存列表來公開:例如,它可能需要衝刷不同機器的庫來構建列表。我的觀點 - 無論做得怎麼樣 - 都是因爲迭代歌曲的複雜性增加了,這種邏輯可以集中存放在MusicLibrary中,IMusicVisitor對象可以處理歌曲集合。