责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求为止。每个处理者都包含对下一个处理者的引用,形成一个链。请求从链的头部开始传递,沿着链传递,直到找到能够处理请求的处理者。

以下是一个简单的 PHP 责任链模式的示例:
<?php

// 处理者接口
interface Handler {
    public function handleRequest($request);
}

// 具体处理者1
class ConcreteHandler1 implements Handler {
    private $successor;

    public function setSuccessor(Handler $successor) {
        $this->successor = $successor;
    }

    public function handleRequest($request) {
        if ($request == "Type1") {
            echo "ConcreteHandler1 handles the request.\n";
        } elseif ($this->successor !== null) {
            // 转发请求给下一个处理者
            $this->successor->handleRequest($request);
        } else {
            echo "ConcreteHandler1 cannot handle the request.\n";
        }
    }
}

// 具体处理者2
class ConcreteHandler2 implements Handler {
    private $successor;

    public function setSuccessor(Handler $successor) {
        $this->successor = $successor;
    }

    public function handleRequest($request) {
        if ($request == "Type2") {
            echo "ConcreteHandler2 handles the request.\n";
        } elseif ($this->successor !== null) {
            // 转发请求给下一个处理者
            $this->successor->handleRequest($request);
        } else {
            echo "ConcreteHandler2 cannot handle the request.\n";
        }
    }
}

// 客户端代码
$handler1 = new ConcreteHandler1();
$handler2 = new ConcreteHandler2();

$handler1->setSuccessor($handler2);

// 向第一个处理者发送请求
$handler1->handleRequest("Type1");
$handler1->handleRequest("Type2");
$handler1->handleRequest("Type3");

在这个例子中,Handler 接口定义了处理者的基本方法,具体处理者 ConcreteHandler1 和 ConcreteHandler2 实现了这个接口。每个具体处理者都可以处理一种类型的请求,并在处理完成后将请求传递给下一个处理者。

客户端代码创建了两个具体处理者,并将它们连接成一个链,然后通过第一个处理者向链中发送请求。责任链模式允许请求沿着链传递,直到找到能够处理请求的处理者。

责任链模式的优点在于它能够解耦发送者和接收者,使得系统更灵活,并且可以动态地调整处理链。


转载请注明出处:http://www.pingtaimeng.com/article/detail/11952/PHP