一文读懂php设计模式之责任链模式

1. 责任链模式介绍

责任链模式是一种行为设计模式,它允许将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求。每个处理者都有一个对下一个处理者的引用,形成一个链条。请求从链条的起始点传入,沿链条一直到达能够处理请求的处理者为止。

责任链模式的核心思想是将请求和处理分离,使得请求发送者无需知道处理请求的具体对象,将请求的发送和处理解耦。这种解耦可以让请求的发送者和接受者之间的耦合度更低,同时也增加了代码的灵活性。

2. 责任链模式的结构

责任链模式由以下几个角色组成:

Abstract Handler 抽象处理者:定义了一个处理请求的接口,包含一个对下一个处理者的引用。

Concrete Handler 具体处理者:实现抽象处理者接口,具体处理请求的地方。

Client 客户端:创建责任链并将请求发送给第一个处理者。

3. 责任链模式的实现步骤

3.1 定义抽象处理者

abstract class Handler

{

protected $nextHandler;

public function setNext(Handler $handler)

{

$this->nextHandler = $handler;

}

public abstract function handleRequest(int $request);

}

抽象处理者定义了一个设置下一个处理者的方法,并声明了处理请求的抽象方法。

3.2 实现具体处理者

class ConcreteHandler1 extends Handler

{

public function handleRequest(int $request)

{

if ($request >= 0 && $request < 10) {

echo "ConcreteHandler1 处理请求 {$request}" . PHP_EOL;

} elseif ($this->nextHandler != null) {

$this->nextHandler->handleRequest($request);

}

}

}

class ConcreteHandler2 extends Handler

{

public function handleRequest(int $request)

{

if ($request >= 10 && $request < 20) {

echo "ConcreteHandler2 处理请求 {$request}" . PHP_EOL;

} elseif ($this->nextHandler != null) {

$this->nextHandler->handleRequest($request);

}

}

}

class ConcreteHandler3 extends Handler

{

public function handleRequest(int $request)

{

if ($request >= 20) {

echo "ConcreteHandler3 处理请求 {$request}" . PHP_EOL;

} elseif ($this->nextHandler != null) {

$this->nextHandler->handleRequest($request);

}

}

}

具体处理者根据实际需求进行具体实现,如果自己不能处理该请求,则将请求传递给下一个处理者。

3.3 创建责任链

$handler1 = new ConcreteHandler1();

$handler2 = new ConcreteHandler2();

$handler3 = new ConcreteHandler3();

$handler1->setNext($handler2);

$handler2->setNext($handler3);

$handler1->handleRequest(5);

$handler1->handleRequest(15);

$handler1->handleRequest(25);

使用上述代码创建了一个责任链,将请求从 handler1 发送到 handler2,再传递到 handler3。根据请求的不同,不同的处理者会处理请求或者将请求传递给下一个处理者。

4. 责任链模式的优缺点

4.1 优点

降低了请求的发送者和接受者之间的耦合度。

增强了代码的灵活性,可以动态添加新的处理者,无需修改客户端代码。

可以根据实际需求自由组合处理者,组成不同的处理链路。

4.2 缺点

请求会从链条的起始位置依次传递到链条的末尾,直到找到能够处理请求的处理者。这个过程中可能会有性能上的开销。

责任链的最大长度可能会有一定的限制,过长的链条会影响处理性能。

请求如果没有被任何处理者处理,可能会导致请求无法得到处理。

5. 责任链模式的应用场景

责任链模式适用于以下场景:

多个对象可以处理一个请求,但具体哪个对象处理该请求在运行时才能确定。

在不明确指定接收者的情况下,向多个对象中的一个提交请求。

需要动态指定处理者链的情况。

6. 总结

责任链模式能够将请求发送者和接收者解耦,使得请求的发送者无需知道具体的处理者,增加了代码的灵活性。同时,责任链模式可以根据实际需要动态组织处理者链,方便进行处理逻辑的扩展和修改。

然而,责任链模式的处理过程可能会存在一定的性能开销,过长的链条可能会影响处理性能。在使用责任链模式时,需要根据实际场景进行合理的折中和设计。

后端开发标签