2010-03-31 8 views
5

Myślę o utworzeniu obiektu filtrującego, który filtruje i usuwa wszystkie elementy, takie jak znaczniki html z kontekstu. Ale chcę, żeby był niezależny, co oznacza, że ​​wzór, który mogę zastosować, pomoże mi dodać więcej filtrów w przyszłości bez wpływu na obecne kody. Myślałem, że chodzi o Abstract Factory, ale wygląda na to, że nie zadziała tak, jak chcę. Więc może budowniczy, ale wygląda to tak samo. Nie wiem, jestem nieco zmieszany, niektórzy polecają mi wzór, który może rozwiązać mój problem, ale wcześniej, pozwól mi trochę rozwikłać problem.Wzorce projektowe Zalecenie dla opcji filtrowania

Powiedzmy, że mam klasę, która ma pole lub właściwość Opis, co jeszcze. Potrzebuję filtrów, które usuwają rzeczy, które chcę z tej właściwości opisu. Dlatego za każdym razem, gdy stosuję filtr, mogę dodać więcej filtru w warstwie podstawowej. Zamiast więc ponownie dotykać pola Opis, mogę łatwo dodać więcej filtrów i wszystkie filtry będą działały w polu Opis i usuwają wszystko, co mają usunąć z kontekstu Opis.

Mam nadzieję, że mógłbym opisać mój problem. Myślę, że niektórzy z was wpadli wcześniej w tę samą sytuację.

góry dzięki ...

Edit:

I rzeczywiście chcą tworzyć filtry jako typy/klas zamiast zwykłych metod czy cokolwiek innego. Na przykład:

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. 
    } 
} 

W tym momencie, jeśli chcę zastosować abstrakcyjną fabrykę, która byłaby pozbawiona sensu lub też Builder. Ponieważ nie chcę żadnej konkretnej rzeczy, potrzebuję ich wszystkich.

Dzięki za odpowiedzi przy okazji.

Edycja 2 - możliwa odpowiedź dla mnie

Ok pozwala myśleć o strukturze strategii z interfejsów zamiast delegatów.

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

[Filter Pattern Design Z Przykład] (http://www.singhajit.com/filter-design-pattern/) –

Odpowiedz

3

Czy obejrzałeś strategy pattern? Pozwala na zamianę algorytmów.

Jeśli to nie jest to, czego szukasz, być może bardziej odpowiedni będzie model decorator pattern. Umożliwi to zawijanie filtrów i stosowanie wielu w razie potrzeby.

+0

myślę dekorator nie jest tym, czego chcę. Ponieważ zawsze, gdy muszę zastosować nowy filtr, muszę go dodać ręcznie do obiektu, który chcę ozdobić. Potrzebuję bardziej abstrakcyjnego sposobu na zrobienie tego. – Tarik

+0

Nie jestem pewien. Dzięki dekoratorowi możesz po prostu ułożyć inny filtr jeden na drugim. Kiedy więc nazwiesz metodę filtrowania większości filtrów zewnętrznych, zastosuje on filtry kapsułkowane. Byłoby to podobne do przechodzenia przez wszystkie filtry, tak jak w przykładzie Darena. http://www.dofactory.com/Patterns/PatternDecorator.aspx#_self1 – FrenchData

1

Dla mnie brzmi to jak wzór Strategy.

może być coś jak to (kod w VB):

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

Uwaga: GetFilteredDescription funkcja jest członkiem swojej klasie.

1

Można użyć poniżej wzorów:

  • Strategy Wzór dla różnych typów filtrów
  • łańcucha odpowiedzialności za stosie filtra (można dodać Wzorzec polecenia tutaj dla różnych łańcuchów w środowisku wielozadaniowym, czy można implementacja łańcucha opartego na priorytetach itd.)
  • Builder lub Abstract Factory dla tworzenia instancji Filter.
8

Po prostu nie chudnij: Zdefiniuj filtr jako Func<string, string>. Jeśli trzymać je w kolekcji (List<Func<string, string>>), można po prostu zrobić:

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

Można również używać LINQ skrócić powyższy pętlę:

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

W ten sposób nie trzeba zdefiniować hierarchię klas do filtrowania. Jest to dobre dla środowiska, ponieważ niedługo skończą nam się klasy i przestrzenie nazw!

Aby zawijać rzeczy, proponuję podklasy listy:

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

Cóż, tak naprawdę nazywa się wzór strategii tho :) w delegaci C# są używane do wzorca strategii, ale podoba mi się przykład. Dzięki. – Tarik

+0

Ale twój jest trochę inny, ponieważ nie zmieniasz strategii, po prostu uruchamiasz wszystkie zastosowane delegacje, co jest w pewnym sensie tym, czego chcę. – Tarik

+0

A czy powinienem zachować metody na liście? Czy nie mogę I + = dodać więcej metod do Delegowania? – Tarik

Powiązane problemy