C# 过滤选项的设计模式推荐
我想创建一个filter对象,它可以从上下文中过滤和删除所有内容,比如html标记。但我希望它是独立的,这意味着我可以应用的设计模式将帮助我在未来添加更多的过滤器,而不会影响当前的代码。我以为是抽象工厂,但它似乎不会按我想要的方式运作。也许是建设者,但看起来是一样的。我不知道我有点困惑,有人请给我推荐一个设计模式,可以解决我的问题,但在此之前,让我详细阐述一下这个问题 假设我有一个类,它有描述字段或属性。我需要过滤器,从这个描述属性中删除我想要的东西。因此,每当我应用过滤器时,我都可以在底层添加更多过滤器。因此,我可以轻松地添加更多过滤器,而不是重新接触描述字段,所有过滤器将针对描述字段运行,并从描述上下文中删除它们应该删除的内容 我希望我能描述我的问题。我想你们中的一些人以前也遇到过同样的情况 先谢谢你 编辑: 实际上,我想将过滤器创建为类型/类,而不是常规方法或任何东西。比如:C# 过滤选项的设计模式推荐,c#,.net,design-patterns,C#,.net,Design Patterns,我想创建一个filter对象,它可以从上下文中过滤和删除所有内容,比如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();
}
}
你看过报纸了吗?它允许您交换算法
如果这不是你要找的,也许这本书会更合适。这将允许您包装过滤器,并在需要时应用多个过滤器。对我来说,这听起来像是一种模式 可能是这样的(代码在VB中):
注意:
GetFilteredDescription
是类的成员函数。您可以使用以下模式:
- 不同过滤器类型的策略模式
- 过滤器堆栈的责任链(您可以在这里为多任务环境中的不同链添加命令模式,或者可以实现基于优先级的链等等)
- 过滤器实例创建的生成器或抽象工厂李>
它类似于策略,在Microsoft产品中得到了广泛的应用。为什么不轻量级使用:将过滤器定义为
函数。如果将它们保存在一个集合中(列表
),您只需执行以下操作:
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));
}
}
公共类筛选器集合:列表
{
公共字符串筛选器(字符串文本)
{
返回此.Aggregate(文本,(seed,func)=>func(seed));
}
}
我认为装饰师不是我想要的。因为每当我需要应用新过滤器时,我都必须手动将其添加到我想要装饰的对象中。我需要更抽象的方法来做,我不确定。使用decorator,您可以将不同的过滤器一个接一个地堆放起来。因此,当您调用大多数外部过滤器的filter方法时,他将应用封装的过滤器。这类似于在Daren的示例中循环所有过滤器。实际上,它被称为策略模式tho:)在C中,委托用于策略模式,但我喜欢你的例子。谢谢。但是你的有点不同,因为你没有改变策略,你只是在运行所有应用的委托,这是我想要的。我应该把这些方法保存在一个列表中吗?我不能+=向委托添加更多的方法吗?你可以+=向委托添加更多的方法,但你所能做的就是一次调用它们(从我可靠的引用中可以看出)。因此,不。请将它们保存在列表中,但请参见上面的子类。下面是一个泛型FilterCollection的示例:
public class FilterCollection : List<Func<string, string>>
{
public string Filter(string text)
{
return this.Aggregate(text, (seed, func) => func(seed));
}
}