Рекомендация шаблонов разработки для фильтрации опции

Я думаю для создания объекта фильтра, который фильтрует, и удалите все как теги HTML от контекста. Но я хочу, чтобы это было независимо, что означает шаблон разработки, который я могу применить, поможет мне добавить, что больше просачивается будущее, не производя текущие коды. Я думал Абстрактная Фабрика, но кажется, что это не собирается разрабатывать способ, которым я хочу. Таким образом, возможно, разработчик, но это смотрит то же. Я не знаю, что отчасти смущен, кто-то, рекомендуйте мне шаблон разработки, который может решить мою проблему, но прежде чем это позволило мне разработать проблему немного.

Позволяет говорят, что у меня есть класс, который имеет поле Description или свойство что когда-либо. И мне нужны фильтры, которые удаляют вещи, которые я хочу от этого свойства Description. Таким образом каждый раз, когда я применяю фильтр, я могу добавить, больше просачиваются базовый уровень. Таким образом вместо того, чтобы ретушировать поле Description, я могу легко добавить больше фильтров, и все фильтры выполнят для поля Description и удалят то, что они, как предполагается, удаляют из контекста Описания.

Я надеюсь, что мог описать свою проблему. Я думаю, что некоторые из Вас столкнулись с той же ситуацией прежде.

Заранее спасибо...

Редактирование:

Я на самом деле хочу создать фильтры как типы/классы вместо обычных методов или что бы то ни было. Как:

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();
   }
}
5
задан Tarik 2 April 2010 в 03:58
поделиться

5 ответов

Вы смотрели на шаблон стратегии ? Это позволяет менять алгоритмы местами.

Если это не то, что вы ищете, возможно, шаблон декоратора будет более подходящим. Это позволит вам обернуть фильтры и при необходимости применить несколько.

3
ответ дан 18 December 2019 в 13:12
поделиться

А как насчет шаблона "Поставщик"? http://msdn.microsoft.com/en-us/library/ms972319.aspx

Он похож на стратегию и тщательно используется в продуктах Microsoft.

1
ответ дан 18 December 2019 в 13:12
поделиться

Вы можете использовать следующие шаблоны:

  • Шаблон стратегии для различных типов фильтров
  • Цепочка ответственности для вашего стека фильтров (Вы можете добавить здесь шаблон команд для различных цепочек в многозадачной среде, или вы можете реализовать цепочку на основе приоритета или так далее)
  • Builder или Абстрактная фабрика для создания экземпляров фильтра.
1
ответ дан 18 December 2019 в 13:12
поделиться

Для меня это звучит как шаблон Стратегия .

Может быть что-то вроде этого (код на VB):

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

Примечание: GetFilteredDescription является функцией-членом вашего класса.

1
ответ дан 18 December 2019 в 13:12
поделиться

Почему бы вам просто не пойти по пути облегчения: Определите свой фильтр как Func. Если вы храните их в коллекции (List>), вы можете просто сделать:

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

Вы также можете использовать Linq для сокращения приведенного выше цикла:

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

Таким образом, вам не придется определять иерархию классов для фильтрации. Это хорошо для окружающей среды, так как очень скоро у нас закончатся классы и пространства имен!

Чтобы завершить работу, я предлагаю вам подкласс List:

public class FilterCollection : List<Func<string, string>>
{
    public string Filter(string text)
    {
        return this.Aggregate(text, (seed, func) => func(seed));
    }
}
8
ответ дан 18 December 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: