2010-04-10 17 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

मेरी राय में, इस पैटर्न की उपयोगिता को संगीत पुस्तकालय के कार्यान्वयन के साथ करना है। जैसा कि ऊपर दिखाया गया है, यह सबसे सरल रूप में है, यह सिर्फ विज़िटर में गीतों की सूची में गुजर रहा है। विज़िट विधि। एक अधिक जटिल अनुप्रयोग में एक्सप्लोर करने के लिए इन-मेमोरी सूची नहीं हो सकती है: उदाहरण के लिए इसे सूची बनाने के लिए अलग-अलग मशीनों के पुस्तकालयों को खराब करना पड़ सकता है। मेरा मुद्दा - हालांकि बुरी तरह से बनाया गया - यह है कि पुनरावृत्त गीतों की जटिलता बढ़ जाती है, इसलिए उस तर्क को संगीत पुस्तकालय में केंद्रीय रूप से रखा जा सकता है, और IMusicVisitor ऑब्जेक्ट्स केवल गाने के संग्रह से निपट सकते हैं।

संबंधित मुद्दे