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_Composite_Chain Of Responsibility - Fatal编程技术网

Design patterns 这是阵列中回退服务的设计模式

Design patterns 这是阵列中回退服务的设计模式,design-patterns,composite,chain-of-responsibility,Design Patterns,Composite,Chain Of Responsibility,让我们假设我看到了一个FallbackCompositeService,客户端对象使用它来获得具有回退机制的结果。 它使用方法doSomething()实现了一个FallbackServiceInterface 我们有一个提供服务的DI容器,该容器用一系列具体的回退策略实例化(这里是伪PHP示例): 每个回退服务也实现了fallbackservicecinterface,因此它们也doSomething() 当我们调用$result=$fallbackCompositeService->doSo

让我们假设我看到了一个
FallbackCompositeService
,客户端对象使用它来获得具有回退机制的结果。 它使用方法
doSomething()
实现了一个
FallbackServiceInterface

我们有一个提供服务的DI容器,该容器用一系列具体的回退策略实例化(这里是伪PHP示例):

每个回退服务也实现了
fallbackservicecinterface
,因此它们也
doSomething()

当我们调用
$result=$fallbackCompositeService->doSomething()
时,服务通过其调用相同方法的子服务循环,第一个非空规则响应“获胜”并返回

问题是:

  • 这个实现是复合模式的“退化”版本吗(因此得名)
  • 还是责任链的“退化”版本(将
    nextHandler()
    指针简化为通过数组的迭代)
  • 或者别的什么/未定义的/两者都有/随便什么。。。?它的潜在缺点是什么

复合模式设想创建一个包含复合节点和叶节点的树结构,例如由表达式解析器生成的树结构。所有节点都有相同的接口,并包含它们自己的evaluate()实现。在head节点上调用evaluate()时,所有节点都将贡献其最终答案的一部分(按照树遍历指定的正确顺序-假设解析器知道它在做什么!)。这与您的示例不同,在您的示例中,当一个节点执行其任务时,处理停止

责任链设想了一个对象的链接列表——每个对象实现相同的接口,例如doSomething()。当对head对象调用doSomething()时,它要么执行某个操作并返回,要么它的doSomething()调用下一个对象doSomething(),依此类推,直到完成某项操作(或不执行!)。这与您的示例非常相似,除了在您的示例中手动尝试注入数组中的每个回调,直到成功

因此,您的示例看起来非常像责任链战略“意图”的实现

注意,各种模式之间有很多相似之处,责任链、装饰器和组合都使用节点对象的链接列表来完成它们的工作。他们的意图不同,但很容易假设任何模式都是其他模式的退化版本。树(复合)是一个链表,其中每个节点只有一个子节点(装饰器和链)


有人指出,模式通常涉及OOP,而您的示例是用回调来表达的。因此,如果您在评论中指出您遵循的是链式模式,那么代码审阅者可能会寻找传统的OOP实现并感到困惑。但是如上所述,您的代码完成了预期的任务,但在没有限定注释的情况下标记为链模式并非100%清晰。

这根本不是“设计模式”(从GOF的意义上讲),因为它与OOP设计无关。@Dai。不同意,对我来说,这是一种模式,它依赖于组合、类、接口以特定的、可描述的方式组织起来,并用于特定的目的。如果它是有效的还是无效的,或者如果它是一种更优雅的GoF模式的退化形式,这是有争议的,这正是我所要求的。听起来更像是一种自动的策略模式,不幸的是,必须实际尝试该策略,以确定它是否是您所需要的。@ChiefTwoPencils,如果回退逻辑是您所追求的,这并不不幸。此外,在这种情况下,我们没有注入具体的策略,所以我不太相信。没错,但必要的事情仍然可能是不幸的。而且,没有必要“注入具体的战略”使其成为战略模式;你是怎么理解的?
new FallbackCompositeService([
  new Rule1FallbackService(),
  new Rule2FallbackService(),
   ... 
])