这种模式的名称是什么?

时间:2012-01-25 23:06:09

标签: design-patterns

我正在编写一个规范,我希望(以明确的方式)说明程序员使用这种模式:

我们必须对我们正在处理的数据应用多个过滤器。配置允许创建这些过滤器。可能有几个,或者没有。我不希望在导出类中使用这种逻辑(因为它可能会在未来变大,使用我们现在无法预见的不同类型的过滤器)。我希望它们一个接一个地运行,所以我要在导出类中要求一个方法:“addFilter”,它应该将对象存储在一个内部数组中,然后在实际的导出过程运行时执行它们

我不知道这个问题是否足够明确。这就像一个链式策略,但不完全是一个策略,因为根本不需要过滤器。

同样,问题是:我应该如何在规范中调用此模式?


编辑:我正在尝试做的一个例子:

$report = new Report();
$report->addFilter(new RemoveSpaces())
       ->addFilter(new SubstituteText($predefined_substitutions_array)
       ->addFilter(new FixCapitals())
       ->addFilter(new Encode("utf8"));
echo($report->generate());   // filters are actually used during generation.

据说,用户应该能够决定是否删除SpaceSpaces,要替换什么文本,是否大写单词,使用什么编码等等。将来肯定会在用户(客户端)上添加一些过滤器,实际上)请求。

一旦考虑因素,过滤器应该有一个报告可以调用的简单接口:

foreach($this->filters as $current_filter) {
  $data = $this->filters[$current_filter]->applyTo($data);
}

4 个答案:

答案 0 :(得分:2)

GoF“责任链”模式浮现在脑海中。以下是维基百科的描述:http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

答案 1 :(得分:2)

我认为你不必像大多数现实世界中的问题那样挑选一种模式,一种模式通常不会覆盖整个实现。因此,在您的规范中,您可以指定实现受到启发的所有模式。您可以从原始模式中记录实现中的不同之处。

在您的具体情况下,它看起来类似于Chain of Responsibility

您还可以查找Decorator模式,因为这也意味着实现类似过滤器的功能。

BTW另一种类似于你的模式是Command Pattern。因此,在您的情况下,generate的{​​{1}}与Report的{​​{1}}类似,过滤器是列表中的命令。

答案 2 :(得分:1)

看起来非常像Chain of responsibility。请注意,每个过滤器都可以决定不继续进行链接。并且通常会有一个“链”对象传递给每个后续过滤器。

如果您不需要这些链语义,可以在目标对象周围简单地将其视为proxies

答案 3 :(得分:1)

我实际上说你没有包含足够的代码来确定可以用来实现你的目标,因为你没有显示你的Filter类的一些示例代码或签名。

您的报告类如何与Filter类交互(反之亦然)?

我不认为它是一个典型的责任链,因为在这种情况下,每个参与者都有责任调用下一个参与者,通常是在其之前或之后执行自己的代码。想想Windows如何链接WindProc,您可以在prio WindProc之前或之后执行代码,并且可以选择不调用它。

如果实现与核心对象相同的接口,那么这些过滤器对象可以是装饰器,然后它们相互包装。但是您的代码示例将对象放在一个简单的列表中。在装饰者中你经常会看到:

FilterA fA = new FilterA(coreObject);
FilterB fB = new FilterB(fA);
FilterC fC = new FilterC(fB);

当然,这不一定要通过构造函数来完成,所以就像我说的那样,我们需要看到更多代码才能知道它是否是一个装饰器。

我倾向于认为你正在追求“管道和过滤器”模式,其中每个操作的输出是下一个操作的输入,但即使这一点在不知道更多的情况下也不清楚。我无法判断每个过滤器是否对同一个事物起作用(例如巨大的字符串),或者每个过滤器都应该与Report对象模型的某些方面相互作用。

例如,如果一个Report的对象属性是当前的Encoder,那么你的Encode("utf8")过滤器可能只是作为一个配置/安装一个Encoder子类来处理磁盘持久性的函数。战略。同时,您的SubstituteText($predefined_substitutions_array)会对报表所拥有的参数集合进行操作,以交换运行时值。

我建议您描述您想要实现的目标,而不是如何实现目标。