005-PHP设计模式之责任链模式

责任链模式是一种设计模式,允许多个对象处理同一请求,降低了耦合度。在PHP示例中,创建了一个Request类和一系列Handler子类,构成处理链。请求沿链传递,由相应级别的Handler处理。模式优点在于解耦请求者与处理者,但可能导致性能问题和调试复杂性。在实际使用中,需要注意控制链长度以避免性能下降。
摘要由CSDN通过智能技术生成

五、责任链模式

5.1什么是责任链模式

使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,
并沿着这条链传递该请求,直到有对象处理它为止

5.2怎么实现责任链模式

责任链模式的核心在“链”上,“链”是由多个处理者 Handler 组成的

抽象的 Handler 类:定义抽象方法,提供注册下一个 Handler 的接口

具体的 Handler 类:实现抽象类方法,注册自己能处理的事件级别

事件类:定义自己的事件级别

<?php

class Request
{
    private int $level = 1;
    public function __construct(int $level)
    {
        $this->level = $level;
    }

    public function getLevel(): int
    {
        return $this->level;
    }
}

abstract class Handler
{
    private Handler $nextHandler;
    public function handleMessage(Request $request): bool
    {
        $response = false;
        if ($this->getHandlerLevel() == $request->getLevel()) {
            $response = $this->echo();
        } else {
            if (isset($this->nextHandler)) {
                $response = $this->nextHandler->handleMessage($request);
            }
        }
        return $response;
    }

    public function setNext(Handler $handler)
    {
        $this->nextHandler = $handler;
    }

    protected abstract function getHandlerLevel(): int;
    protected abstract function echo(): bool;
}

class Handler1 extends Handler
{

    protected function getHandlerLevel(): int
    {
        return 1;
    }

    protected function echo(): bool
    {
        echo "handler1 deal\n";
        return true;
    }
}

class Handler2 extends Handler
{

    protected function getHandlerLevel(): int
    {
        return 2;
    }

    protected function echo(): bool
    {
        echo "handler2 deal\n";
        return true;
    }
}

class Handler3 extends Handler
{

    protected function getHandlerLevel(): int
    {
        return 3;
    }

    protected function echo(): bool
    {
        echo "handler3 deal\n";
        return true;
    }
}

$handler1 = new Handler1();
$handler2 = new Handler2();
$handler3 = new Handler3();

$handler1->setNext($handler2);
$handler2->setNext($handler3);

echo "start deal request2\n";
$request2 = new Request(2);
$handler1->handleMessage($request2);
echo "end deal request2\n\n\n";


echo "start deal request4\n";
$request4 = new Request(4);
if (!$handler1->handleMessage($request4)) {
    echo "request4 not be processed\n";
}
echo "end deal request2\n";


5.3责任链模式优点是什么

链模式非常显著的优点是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,
两者解耦,提高系统的灵活性

5.4责任链模式缺点是什么

责任链有两个非常显著的缺点:

  1. 性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题

  2. 调试不很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂

5.5责任链模式注意事项

链中节点数量需要控制,避免出现超长链的情况,一般的做法是在Handler中设置一个最大节点数量,
在setNext方法中判断是否已经是超过其阈值,超过则不允许该链建立,避免无意识地破坏系统性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值