Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 过滤选项的设计模式推荐_C#_.net_Design Patterns - Fatal编程技术网

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

C# 过滤选项的设计模式推荐,c#,.net,design-patterns,C#,.net,Design Patterns,我想创建一个filter对象,它可以从上下文中过滤和删除所有内容,比如html标记。但我希望它是独立的,这意味着我可以应用的设计模式将帮助我在未来添加更多的过滤器,而不会影响当前的代码。我以为是抽象工厂,但它似乎不会按我想要的方式运作。也许是建设者,但看起来是一样的。我不知道我有点困惑,有人请给我推荐一个设计模式,可以解决我的问题,但在此之前,让我详细阐述一下这个问题 假设我有一个类,它有描述字段或属性。我需要过滤器,从这个描述属性中删除我想要的东西。因此,每当我应用过滤器时,我都可以在底层添加

我想创建一个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));
    }
}