2010-03-31 2 views
5

Je pense à créer un objet filtre qui filtre et supprime tout comme les balises html d'un contexte. Mais je veux qu'il soit indépendant, ce qui signifie que le modèle de conception que je peux appliquer m'aidera à ajouter plus de filtres dans le futur sans affecter les codes actuels. Je pensais à Abstract Factory mais il semble que ça ne marchera pas comme je le veux. Donc, peut-être constructeur, mais il semble même. Je ne sais pas je suis un peu confus, quelqu'un s'il vous plaît me recommander un modèle de conception qui peut résoudre mon problème, mais avant cela, permettez-moi d'élaborer un peu le problème.Motifs de conception Recommandation pour l'option de filtrage

Disons que j'ai une classe qui a un champ Description ou une propriété. Et j'ai besoin de filtres qui suppriment les choses que je veux de cette propriété Description. Donc, chaque fois que j'applique le filtre, je peux ajouter plus de filtre dans le niveau sous-jacent. Ainsi, au lieu de retoucher le champ Description, je peux facilement ajouter plus de filtres et tous les filtres vont s'exécuter dans le champ Description et supprimer tout ce qu'ils sont censés supprimer du contexte Description.

J'espère pouvoir décrire mon problème. Je pense que certains d'entre vous ont déjà été confrontés à la même situation.

Merci à l'avance ...

Edit:

Je veux vraiment créer des filtres comme types/classes au lieu de méthodes régulières ou autre chose. Comme:

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

À ce stade, si je veux appliquer Abstract Factory qui serait vide de sens ou Builder ainsi. Parce que je ne veux pas de chose particulière, j'ai besoin de tous.

Merci pour vos réponses d'ailleurs.

Edit 2 - Réponse possible pour moi

permet Okay penser modèle de stratégie avec des interfaces plutôt que les délégués.

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

[Filtre Design Motif à l'exemple] (http://www.singhajit.com/filter-design-pattern/) –

Répondre

3

Avez-vous regardé le strategy pattern? Cela vous permet d'échanger des algorithmes.

Si ce n'est pas ce que vous cherchez, peut-être le decorator pattern sera plus approprié. Cela vous permettra d'envelopper les filtres et d'en appliquer plusieurs si nécessaire.

+0

Je pense que décorateur Ce n'est pas ce que je veux. Parce que chaque fois que j'ai besoin d'appliquer un nouveau filtre, je dois aller ajouter ceci manuellement dans l'objet que je veux décorer. J'ai besoin d'une façon plus abstraite de le faire. – Tarik

+0

Je ne suis pas sûr. Avec le décorateur vous pouvez simplement empiler les différents filtres les uns dans les autres. Ainsi, lorsque vous appelez la méthode de filtrage de la plupart des filtres externes, il appliquera les filtres encapsulés. Ce serait similaire à boucler tous les filtres comme dans l'exemple de Daren. http://www.dofactory.com/Patterns/PatternDecorator.aspx#_self1 – FrenchData

1

Pour moi, cela ressemble au modèle Strategy.

Peut-être quelque chose comme ça (le code est en VB):

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

Note: la GetFilteredDescription est fonction de membre de votre classe.

1

Vous pouvez utiliser ci-dessous les modèles:

  • Motif de la stratégie pour les différents types de filtres
  • de la chaîne de responsabilité de votre pile de filtres (Vous pouvez ajouter modèle de commande ici pour différentes chaînes dans un environnement multi-tâches, ou vous pouvez implémenter la chaîne basée sur la priorité, etc.)
  • Générateur ou Usine abstraite pour les créations d'instance de filtre.
8

Pourquoi n'allez-vous pas tout simplement à la lumière? Définissez votre filtre comme Func<string, string>. Si vous gardez ceux-ci dans une collection (List<Func<string, string>>), vous pouvez simplement faire:

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

Vous pouvez également utiliser LINQ pour raccourcir la boucle au-dessus:

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

De cette façon, vous n'avez pas définir une hiérarchie de classe pour le filtrage. C'est bon pour l'environnement, car nous allons bientôt manquer de classes et d'espaces de noms!

Pour envelopper les choses, je vous suggère de sous-classe Liste:

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

Eh bien, en fait, il est appelé modèle de stratégie tho :) en délégués C# sont utilisés pour le modèle de stratégie, mais j'aime votre exemple. Merci. – Tarik

+0

Mais le vôtre est un peu différent puisque vous ne changez pas la stratégie que vous utilisez simplement tous les délégués appliqués, ce qui est un peu ce que je veux. – Tarik

+0

Et devrais-je garder les méthodes dans une liste? Puis-je + = ajouter plus de méthode à déléguer? – Tarik

Questions connexes