Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Design patterns 什么';这个图案的名字是什么?_Design Patterns - Fatal编程技术网

Design patterns 什么';这个图案的名字是什么?

Design patterns 什么';这个图案的名字是什么?,design-patterns,Design Patterns,我正在编写一个规范,其中我希望(以明确的方式)声明程序员使用以下模式: 我们必须对正在处理的数据应用几个过滤器。该配置允许创建这些过滤器。可以有几个,也可以没有。我不想在导出类中使用这种逻辑(因为它将来可能会变得更大,使用我们现在无法预见的不同类型的过滤器)。我希望它们一个接一个地运行,因此我将在导出类中请求一个方法:“addFilter”,该方法应将对象存储在内部数组中,然后在实际导出过程运行时执行它们 我不知道这个问题是否足够清楚。它就像一个链式的策略,但并不完全是一个策略,因为它根本不需要

我正在编写一个规范,其中我希望(以明确的方式)声明程序员使用以下模式:

我们必须对正在处理的数据应用几个过滤器。该配置允许创建这些过滤器。可以有几个,也可以没有。我不想在导出类中使用这种逻辑(因为它将来可能会变得更大,使用我们现在无法预见的不同类型的过滤器)。我希望它们一个接一个地运行,因此我将在导出类中请求一个方法:“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.
据推测,用户应该能够决定是否删除空格、替换什么文本、是否大写单词、使用什么编码等。将来一定会根据用户(实际上是客户端)的请求添加一些过滤器

考虑因素后,过滤器应具有报告将调用的简单接口:

foreach($this->filters as $current_filter) {
  $data = $this->filters[$current_filter]->applyTo($data);
}
我想到了GoF的“责任链”模式。以下是维基百科的描述:

我想到了GoF的“责任链”模式。以下是维基百科的描述:

看起来很像。请注意,每个筛选器都可以决定不在链上继续。通常会有一个“链”对象传递给每个后续过滤器

如果您不需要这些链式语义,那么可以简单地将其视为围绕目标对象的。请注意,每个筛选器都可以决定不在链上继续。通常会有一个“链”对象传递给每个后续过滤器


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

我认为您不必选择一种模式,因为在大多数实际问题中,一种模式通常不涵盖整个实现。因此,在您的规范中,您可以指定实现灵感来自的所有模式。您可以记录实现中与原始模式的不同之处

在您的特定情况下,它看起来类似于

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


顺便说一句,另一种模式类似于你的是。因此,在您的情况下,
Report
generate
就像
execute
Command
一样,过滤器是列表中的命令。

我认为您不必选择一种模式,因为在大多数现实问题中,一种模式通常不涵盖整个实现。因此,在您的规范中,您可以指定实现灵感来自的所有模式。您可以记录实现中与原始模式的不同之处

在您的特定情况下,它看起来类似于

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


顺便说一句,另一种模式类似于你的是。因此,在您的情况下,
Report
generate
Command
execute
类似,过滤器是列表中的命令。

,因为您没有显示筛选器类的一些示例代码或签名

报表类如何与过滤器类交互(反之亦然)

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

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

FilterA fA = new FilterA(coreObject);
FilterB fB = new FilterB(fA);
FilterC fC = new FilterC(fB);
当然,这不需要通过构造函数来完成,所以,就像我说的,我们需要看到更多的代码来知道这是否是一个装饰器

我倾向于认为您在追求一种“管道和过滤器”模式,其中每个操作的输出都是下一个操作的输入,但如果不了解更多信息,这一点也不清楚。我无法判断每个过滤器是作用于同一事物(例如一个巨大的字符串),还是应该与报表对象模型的某个方面交互

例如,如果报表的对象属性是当前的
Encoder
,那么您的
Encode(“utf8”)
过滤器可能只是一个配置/安装编码器子类以处理磁盘持久性策略的过滤器。同时,您的
SubstituteText($predefined\u substitutions\u array)
作用于报表拥有的参数集合,以在运行时值中交换


我建议你描述一下你想要实现什么,而不是如何实现它

实际上,我想说,您没有包含足够的代码来确定可以使用哪种模式来实现您的目标,因为您没有显示过滤器类的一些示例代码或签名

报表类如何与过滤器类交互(反之亦然)

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

如果实现sam,这些过滤器对象可以是装饰器