c# - 过滤选项的设计模式推荐

标签 c# .net design-patterns

我正在考虑创建一个过滤器对象,它可以从上下文中过滤和删除诸如 html 标签之类的所有内容。但我希望它是独立的,这意味着我可以应用的设计模式将帮助我在未来添加更多过滤器而不影响当前代码。我想到了抽象工厂,但它似乎不会按照我想要的方式进行。所以也许是 builder ,但它看起来一样。我不知道我有点困惑,请有人向我推荐一种可以解决我的问题的设计模式,但在此之前让我稍微详细说明一下这个问题。

假设我有一个类,它有任何描述字段或属性。我需要过滤器来从这个 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.
   }
}

在这一点上,如果我想应用无意义的Abstract Factory或Builder。因为我不想要任何特定的东西,所以我有点需要它们。

顺便感谢您的回答。

编辑 2 - 我的可能答案

好吧,让我们考虑使用接口(interface)而不是委托(delegate)的策略模式。

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();
   }
}

最佳答案

为什么不轻量化:将过滤器定义为 Func<string, string> .如果你将它们保存在一个集合中(List<Func<string, string>>),你可以这样做:

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));
    }
}

关于c# - 过滤选项的设计模式推荐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2550892/

相关文章:

c# - 当只读属性与对象引用一起使用时 Json.NET 失败?

c# - 用多态替换条件如何

c# - 修改父行为的访问者的层次结构。 Liskov 还好吗?

c# - ListView 调整列大小性能问题(分组)

c# - 在 app.config 中扩展键值对功能

c# - Windows 服务启动顺序导致 WCF 服务出现故障状态

c# - 为什么 Main 必须是静态的才能接受命令行参数?

必须学习的.net技术

c++ - 如何在 C++ 中重新分配?

c# - 使用 IoC 容器时,原始构造函数参数是一个坏主意吗?