Я думаю для создания объекта фильтра, который фильтрует, и удалите все как теги 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();
}
}
Вы смотрели на шаблон стратегии ? Это позволяет менять алгоритмы местами.
Если это не то, что вы ищете, возможно, шаблон декоратора будет более подходящим. Это позволит вам обернуть фильтры и при необходимости применить несколько.
А как насчет шаблона "Поставщик"? http://msdn.microsoft.com/en-us/library/ms972319.aspx
Он похож на стратегию и тщательно используется в продуктах Microsoft.
Вы можете использовать следующие шаблоны:
Для меня это звучит как шаблон Стратегия .
Может быть что-то вроде этого (код на VB):
Function GetFilteredDescription(ByVal iSpecificFilterFunction As AbstractFilterFunction) As Result
Return iSpecificFilterFunction.Filter(Me.description)
End Function
Примечание: GetFilteredDescription
является функцией-членом вашего класса.
Почему бы вам просто не пойти по пути облегчения: Определите свой фильтр как 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));
}
}