天涯论坛

 找回密码
 立即注册
搜索
查看: 20|回复: 2

PHP 责任链模式的用法

[复制链接]

2997

主题

182

回帖

9920万

积分

论坛元老

Rank: 8Rank: 8

积分
99209272
发表于 2024-10-4 18:03:08 | 显示全部楼层 |阅读模式

责任链模式和运用`if`语句的要求判断有以下几点区别:

1. 责任链模式经过将处理规律拆分成独立的处理器类,每一个处理器类都有一个指向下一个处理器的引用,形成一个链条。当一个请求到达时,责任链模式会从链条的头部起始依次传递请求,直到找到能够处理该请求的处理器链条结束。而运用`if`语句的要求判断是一种集中式的处理方式,每一个要求都会在同一个代码块中进行判断。

2. 责任链模式能够动态地调节和扩展处理器的次序和数量,由于每一个处理器都独立存在且只关注自己负责的规律。这使得责任链模式更加灵活和可扩展。相反,运用`if`语句的要求判断需要在同一个代码块中守护和修改多个要求增多了代码的繁杂度和守护成本。

3. 责任链模式支持职责的分离和解耦,每一个处理器只需关注自己负责的规律,不需要认识全部处理流程和其他处理器的细节。这使得责任链模式的代码更加模块化和可守护。而运用`if`语句的要求判断可能会引起代码冗长和重复,由于每一个要求都需要在同一个代码块中编写。

4. 责任链模式适用于处理繁杂的业务流程,其中每一个处理器只负责一小部分规律经过规律拆分成多个处理器,能够加强代码的可读性和可守护性。而运用`if`语句的要求判断适用于简单的规律判断,例如按照区别要求执行区别的操作。

综上所述,责任链模式适用于需要灵活扩展和解耦职责的场景,而运用`if`语句的要求判断适用于简单的规律判断。选取运用哪种方式取决于详细需要和场景。

示例代码:

<?php// 抽象处理器类abstract class Handler{ protected $nextHandler; public function setNext(Handler $handler){ $this->nextHandler = $handler; return$handler; } public function handle($request){ $result = $this->process($request); if ($result === null && $this->nextHandler) { $result = $this->nextHandler->handle($request); } return $result; } abstract protected function process($request);}// 详细处理器类 1class ConcreteHandler1 extends Handler{ protected function process($request){ if ($request >= 0 && $request <= 10) { return ConcreteHandler1 handled the request.; } return null; }}// 详细处理器类 2class ConcreteHandler2 extends Handler{ protected function process($request){ if ($request > 10 && $request <= 20) { return ConcreteHandler2 handled the request.; } return null; }}// 详细处理器类 3class ConcreteHandler3 extends Handler{ protected function process($request){ if ($request > 20 && $request <= 30) { return ConcreteHandler3 handled the request.; } return null; }}// 详细处理器类 4class ConcreteHandler4 extends Handler{ protected function process($request){ if ($request > 30 && $request <= 40) { return ConcreteHandler4 handled the request.;} return null; }}// 客户端代码$handler1 = new ConcreteHandler1();$handler2 = new ConcreteHandler2();$handler3 = new ConcreteHandler3();$handler4 = newConcreteHandler4();$handler1->setNext($handler2) ->setNext($handler3) ->setNext($handler4);$requests = [5, 15, 25, 35, 45];foreach ($requests as $request) {$result = $handler1->handle($request); if ($result) { echo $result . "\n"; } else { echo "No handler found for request: $request\n"; }}

在上面的代码中,咱们首要定义了一个抽象的处理器类 Handler,其中包括了一个指向下一个处理器的引用。而后咱们定义了详细的处理器类 ConcreteHandler1、ConcreteHandler2 和 ConcreteHandler3等,它们分别处理区别要求每一个详细处理器类都会尝试处理请求,倘若要求不符合,则将请求传递给下一个处理器。

最后,在客户端代码中,咱们创建了详细处理器对象,并运用 setNext() 办法将它们串联成一个责任链。而后咱们能够分别运用区别的请求调用 handle() 办法来测试责任链的工作状况,并输出处理结果。

重视,这只是责任链模式的一个简单示例,实质运用能够按照详细需要进行扩展和修改。




上一篇:PHP设计模式-责任链/策略/装饰器/适配器/桥接模式
下一篇:短短两年运用率下滑 40%!曾经风靡全世界的 PHP 为么逐步失去优良?
回复

使用道具 举报

3138

主题

3万

回帖

9996万

积分

论坛元老

Rank: 8Rank: 8

积分
99968624
发表于 2024-10-16 21:33:06 | 显示全部楼层
谷歌外链发布 http://www.fok120.com/
回复

使用道具 举报

3069

主题

3万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99138952
发表于 2024-11-2 11:55:55 | 显示全部楼层
你的见解真是独到,让我受益匪浅。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-22 23:50 , Processed in 0.120183 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.