2010-03-31 23 views
5

मैं एक फ़िल्टर ऑब्जेक्ट बनाने की सोच रहा हूं जो किसी संदर्भ से HTML टैग जैसी चीज़ों को फ़िल्टर और हटा देता है। लेकिन मैं इसे स्वतंत्र होना चाहता हूं जिसका मतलब है कि मैं जिस डिजाइन पैटर्न को लागू कर सकता हूं वह मुझे वर्तमान कोड को प्रभावित किए बिना भविष्य में और अधिक फ़िल्टर जोड़ने में मदद करेगा। मैंने सार फैक्ट्री सोचा लेकिन ऐसा लगता है कि यह जिस तरह से मैं चाहता हूं वह काम नहीं करेगा। तो शायद निर्माता लेकिन यह वही दिखता है। मुझे नहीं पता कि मैं थोड़ी उलझन में हूं, कृपया कोई मुझे एक डिजाइन पैटर्न की सिफारिश करें जो मेरी समस्या का समाधान कर सके लेकिन इससे पहले मुझे समस्या को थोड़ा सा विस्तारित करने दें।फ़िल्टरिंग विकल्प के लिए डिज़ाइन पैटर्न अनुशंसा

आइए कहें कि मेरे पास एक कक्षा है जिसमें विवरण फ़ील्ड या संपत्ति है। और मुझे फ़िल्टर की आवश्यकता है जो मुझे इस विवरण संपत्ति से इच्छित चीजों को हटा दें। इसलिए जब भी मैं फ़िल्टर लागू करता हूं मैं अंतर्निहित स्तर में अधिक फ़िल्टर जोड़ सकता हूं। तो विवरण फ़ील्ड को फिर से स्पर्श करने के बजाय, मैं आसानी से अधिक फ़िल्टर जोड़ सकता हूं और सभी फ़िल्टर विवरण फ़ील्ड के लिए दौड़ेंगे और विवरण संदर्भ से जो कुछ भी हटाना चाहते हैं उसे हटा दें।

मुझे आशा है कि मैं अपनी समस्या का वर्णन कर सकता हूं। मुझे लगता है कि आप में से कुछ पहले एक ही स्थिति में भाग गए थे।

अग्रिम धन्यवाद ...

संपादित करें:

मैं वास्तव में प्रकार/बजाय कक्षाएं नियमित तरीकों या जो कुछ भी रूप में फिल्टर बनाना चाहते हैं। पसंद:

class TextFilter : IFilter 
{ 
    private string something; 
    public string Awesome {get;set;} 
    public string FilterYo(string textFiltered) 
    { 
     // Do filtering 
    } 
} 

class HtmlFilter : IFilter 
{ 
    private string something; 
    private string iGotSomething; 
    public string Awesome {get;set;} 
    public string FilterYo(string textFiltered) 
    { 
     // Do filtering 
    } 
} 

class Main 
{ 
    protected void Main(object sender, EventArgs e) 
    { 
     InputClass input = new InputClass(); 
     string filtered = new StartFiltering().Filter(input.Description); // at this moment, my input class shouldn't know anything about filters or something. I don't know if it makes any sense but this is what in my mind. 
    } 
} 

इस बिंदु पर यदि मैं सार फैक्ट्री लागू करना चाहता हूं जो अर्थहीन या बिल्डर भी होगा। क्योंकि मैं एक विशेष चीज़ नहीं चाहता, मुझे उन सभी को थोड़े की जरूरत है।

रास्ते से आपके उत्तरों के लिए धन्यवाद।

संपादित करें 2 - मेरे

ठीक है के लिए संभावित जवाब रणनीति पैटर्न प्रतिनिधियों के बजाय इंटरफेस के साथ के बारे में सोचने की सुविधा देता है।

interface IFilter //Strategy interface 
{ 
    string Filter(string text); 
} 

class LinkFilter:IFilter //Strategy concrete class 
{ 
    public string Filter(string text) 
    { 
    //filter link tags and return pure text; 
    } 
} 

class PictureFilter:IFilter //Strategy concrete class 
{ 
    public string Filter(string text) 
    { 
    //filter links and return pure text; 
    } 
} 

class Context 
{ 
    private IFilter _filter; 
    private string _text; 
    public Context(IFilter filter,string text) 
    { 
     this._filter = filter; 
     this._text = text; 
    } 

    public void UpdateFilter(IFilter filter) 
    { 
     this._filter = filter; 
    } 

    public string RunFilter() 
    { 

    this._text = _filter.Filter(this._text); 
    return this._text; 
    } 
} 

class MainProgram 
{ 
    static void Main() 
    { 
     MyObject obj = new MyObject(); 
     LinkFilter lfilter = new LinkFilter(); 
     PictureFilter pfilter = new PictureFilter(); 
     Context con = new Context(lfilter,obj.Description); 
     string desc = con.RunFilter(); 
     con.UpdateFilter(pfilter); 
     desc = con.RunFilter(); 
    } 
} 
+0

[उदाहरण के साथ फ़िल्टर डिजाइन पैटर्न] (http://www.singhajit.com/filter-design-pattern/) –

उत्तर

3

क्या आपने strategy pattern पर देखा है? यह आपको एल्गोरिदम स्वैप करने की अनुमति देता है।

यदि आप ऐसा नहीं चाहते हैं, तो शायद decorator pattern अधिक उपयुक्त होगा। यह आपको फिल्टर लपेटने और यदि आवश्यक हो तो एकाधिक लागू करने की अनुमति देगा।

+0

मुझे लगता है कि डेकोरेटर वह नहीं है जो मैं चाहता हूं। क्योंकि जब भी मुझे नए फ़िल्टर को लागू करने की आवश्यकता होती है, मुझे इसे उस ऑब्जेक्ट में मैन्युअल रूप से जोड़ना होता है जिसे मैं सजाने के लिए चाहता हूं। मुझे ऐसा करने के लिए और अधिक अमूर्त तरीका चाहिए। – Tarik

+0

मुझे यकीन नहीं है। सजावट के साथ आप अलग-अलग फ़िल्टर को दूसरे में ढेर कर सकते हैं। तो जब आप अधिकतर बाहरी फ़िल्टर की फ़िल्टर विधि को कॉल करते हैं, तो वह encapsulated फ़िल्टर लागू करेगा। यह डैरेन के उदाहरण के रूप में सभी फ़िल्टरों के माध्यम से लूपिंग के समान होगा। http://www.dofactory.com/Patterns/PatternDecorator.aspx#_self1 – FrenchData

1

मेरे लिए यह Strategy पैटर्न जैसा लगता है।

 Function GetFilteredDescription(ByVal iSpecificFilterFunction As AbstractFilterFunction) As Result 
      Return iSpecificFilterFunction.Filter(Me.description) 
     End Function 

नोट:: GetFilteredDescription अपने वर्ग के सदस्य समारोह है

(कोड वीबी में है) कुछ इस तरह हो सकता है।

1

आप पैटर्न नीचे का उपयोग कर सकते हैं:

  • अलग फ़िल्टर प्रकार
  • अपने फ़िल्टर स्टैक की जिम्मेदारी की चेन के लिए रणनीति पैटर्न (आप कमान पैटर्न यहाँ विभिन्न श्रृंखला के लिए विविध प्रकार के कार्य वातावरण में जोड़ सकते हैं, या आप कर सकते हैं प्राथमिकता आधारित श्रृंखला लागू करें या इतने पर)
  • फ़िल्टर उदाहरण रचनाओं के लिए बिल्डर या सार फैक्टरी।
1

प्रदाता पैटर्न के बारे में क्या? http://msdn.microsoft.com/en-us/library/ms972319.aspx

यह रणनीति के समान है, और इसका उपयोग माइक्रोसॉफ्ट उत्पादों में पूरी तरह से किया जाता है।

8

आप हल्के वजन क्यों नहीं जाते हैं: अपने फ़िल्टर को Func<string, string> के रूप में परिभाषित करें। आप एक संग्रह (List<Func<string, string>>) में इन रखने, तो आप बस कर सकते हैं:

var text = myObject.DescriptionProperty 
foreach (var func in myFuncList) 
{ 
    text = func(text); 
} 

तुम भी Linq का उपयोग कर सकते ऊपर पाश छोटा करने के लिए:

var text = myFuncList.Aggregate(text, (seed, func) => func(seed)); 

इस तरह, आप की जरूरत नहीं है फ़िल्टरिंग के लिए एक श्रेणी पदानुक्रम परिभाषित करें। यह पर्यावरण के लिए अच्छा है, क्योंकि हम जल्द ही कक्षाओं और नामस्थानों से बाहर भागेंगे!

बातें लपेट के लिए, मैं तुम्हें उपवर्ग सूची का सुझाव:

public class FilterCollection : List<Func<string, string>> 
{ 
    public string Filter(string text) 
    { 
     return this.Aggregate(text, (seed, func) => func(seed)); 
    } 
} 
+0

वैसे वास्तव में इसे रणनीति पैटर्न कहा जाता है :) सी # प्रतिनिधियों में रणनीति पैटर्न के लिए उपयोग किया जाता है लेकिन मुझे आपका उदाहरण पसंद है। धन्यवाद। – Tarik

+0

लेकिन आपका लक्ष्य थोड़ा अलग है क्योंकि आप उस रणनीति को नहीं बदल रहे हैं जो आप बस सभी लागू प्रतिनिधियों को चला रहे हैं जो कि मैं चाहता हूं। – Tarik

+0

और क्या मुझे विधियों को सूची में रखना चाहिए? क्या मैं प्रतिनिधि को अधिक विधि जोड़ने के लिए नहीं कर सकता? – Tarik

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