这篇文章主要介绍“PHP如何实现职责链设计模式”,在日常操作中,相信很多人在PHP如何实现职责链设计模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP如何实现职责链设计模式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
PHP实现职责链设计模式
文件结构:
IndexController 为调用端,UserInfoEntity 用户实体用于存用户信息,flow 里面的为各种处理流程
IndexController
<?phpdeclare(strict_types=1);namespace App\Controller;use App\Service\Entity\UserInfoEntity;use App\Service\Flow\Cashier;use App\Service\Flow\Clinic;use App\Service\Flow\Pharmacy;use App\Service\Flow\Reception;use App\Service\StartHandler;class IndexController extends AbstractController{ public function index() { $startHandler = new StartHandler(); $userInfo = (new UserInfoEntity())->setName('zhangsan'); $startHandler->setNextHandler(new Reception()) ->setNextHandler(new Clinic()) ->setNextHandler(new Cashier()) ->setNextHandler(new Pharmacy()); $startHandler->execute($userInfo); }}
UserInfoEntity
<?phpdeclare(strict_types=1);namespace App\Service\Entity;class UserInfoEntity{ private string $name; private bool $registrationDone = false; private bool $doctorCheckUpDone = false; private bool $medicineDone = false; private bool $paymentDone = false; public function getName(): string { return $this->name; } public function setName(string $name): UserInfoEntity { $this->name = $name; return $this; } public function isRegistrationDone(): bool { return $this->registrationDone; } public function setRegistrationDone(bool $registrationDone): UserInfoEntity { $this->registrationDone = $registrationDone; return $this; } public function isDoctorCheckUpDone(): bool { return $this->doctorCheckUpDone; } public function setDoctorCheckUpDone(bool $doctorCheckUpDone): UserInfoEntity { $this->doctorCheckUpDone = $doctorCheckUpDone; return $this; } public function isMedicineDone(): bool { return $this->medicineDone; } public function setMedicineDone(bool $medicineDone): UserInfoEntity { $this->medicineDone = $medicineDone; return $this; } public function isPaymentDone(): bool { return $this->paymentDone; } public function setPaymentDone(bool $paymentDone): UserInfoEntity { $this->paymentDone = $paymentDone; return $this; }}
HandlerInterface
<?phpdeclare(strict_types=1);namespace App\Service;use App\Service\Entity\UserInfoEntity;interface HandlerInterface{ public function setNextHandler(HandlerInterface $handler): HandlerInterface; public function execute(UserInfoEntity $info); public function do(UserInfoEntity $info);}
AbstractHandler
<?phpdeclare(strict_types=1);namespace App\Service;use App\Service\Entity\UserInfoEntity;class AbstractHandler implements HandlerInterface{ private HandlerInterface $nextHandler; public function setNextHandler(HandlerInterface $handler): HandlerInterface { $this->nextHandler = $handler; return $this->nextHandler; } public function execute(UserInfoEntity $info) { if (! empty($this->nextHandler)) { try { $this->nextHandler->do($info); } catch (\Exception $e) { return; } return $this->nextHandler->execute($info); } } public function do(UserInfoEntity $info) { // TODO: Implement do() method. }}
StartHandler
<?phpdeclare(strict_types=1);namespace App\Service;class StartHandler extends AbstractHandler{}
Cashier
<?phpdeclare(strict_types=1);namespace App\Service\Flow;use App\Service\AbstractHandler;use App\Service\Entity\UserInfoEntity;class Cashier extends AbstractHandler{ public function do(UserInfoEntity $info) { echo '收费' . PHP_EOL; $info->setPaymentDone(true); }}
Clinic
<?phpdeclare(strict_types=1);namespace App\Service\Flow;use App\Service\AbstractHandler;use App\Service\Entity\UserInfoEntity;class Clinic extends AbstractHandler{ public function do(UserInfoEntity $info) { echo '诊室' . PHP_EOL; $info->setDoctorCheckUpDone(true); }}
Pharmacy
<?phpdeclare(strict_types=1);namespace App\Service\Flow;use App\Service\AbstractHandler;use App\Service\Entity\UserInfoEntity;class Pharmacy extends AbstractHandler{ public function do(UserInfoEntity $info) { echo '药房' . PHP_EOL; $info->setMedicineDone(true); }}
Reception
<?phpdeclare(strict_types=1);namespace App\Service\Flow;// 挂号use App\Service\AbstractHandler;use App\Service\Entity\UserInfoEntity;class Reception extends AbstractHandler{ public function do(UserInfoEntity $info) { echo '挂号' . PHP_EOL; $info->setRegistrationDone(true); }}
写一个单元测试跑一下 indexController 的 index 方法,结果如下:
到此,关于“PHP如何实现职责链设计模式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!