设计模式学习:职责链模式

技术设计模式

职责链模式:避免请求发送者和请求接收者的耦合关系。将接受者连成一条链,直到有接收者处理请求。
例如,假设你要请假,请假3天以内部门领导可以批准,7天以内需要部门领导和总监批准,7天以上需要部门领导、总监和董事长批准。 你只需向部门领导,部门领导如果察觉超出权限,自动向上级报告并交由上级处理。
职责链模式使客户传递请求后,层层递进,直到有人去处理请求。职责链模式适用于请求接收动态变化、多个对象可能会根据请求不同分别进行处理的情况。

<?php
class Request
{
    /**
     * @var string
     */
    public $requester;
    /**
     * @var int
     */
    public $dayCount;
    /**
     * @var string
     */
    public $reason;

    /**
     * Request constructor.
     * @param $requester string
     * @param $dayCount int
     * @param $reason string
     */
    public function __construct($requester, $dayCount, $reason)
    {
        $this->requester = $requester;
        $this->dayCount = $dayCount;
        $this->reason = $reason;
    }
}

interface Manager
{
    /**
     * @param Request $request
     * @return mixed
     */
    public function handle(Request $request);
}


class DepartmentManager implements Manager
{
    /**
     * @var Manager
     */
    private $supervisor;
    /**
     * @var string
     */
    private $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function handle(Request $request)
    {
        if ($request->dayCount > 3) {
            $this->supervisor->handle($request);
        } else {
            echo $this->name . "批准了" . $request->requester . "的请假, 共" . $request->dayCount . "天";
            echo "\r\n原因是:" . $request->reason;
        }
    }

    public function setSupervisor(Manager $manager)
    {
        $this->supervisor = $manager;
    }
}

class CompanyManager implements Manager
{
    /**
     * @var Manager
     */
    private $supervisor;
    /**
     * @var string
     */
    private $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function handle(Request $request)
    {
        if ($request->dayCount > 7) {
            $this->supervisor->handle($request);
        } else {
            echo $this->name . "批准了" . $request->requester . "的请假, 共" . $request->dayCount . "天";
            echo "\r\n原因是:" . $request->reason;
        }
    }

    public function setSupervisor(Manager $manager)
    {
        $this->supervisor = $manager;
    }
}

class SuperManager implements Manager
{
    /**
     * @var Manager
     */
    private $supervisor;
    /**
     * @var string
     */
    private $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function handle(Request $request)
    {
        echo $this->name . "批准了" . $request->requester . "的请假, 共" . $request->dayCount . "天";
        echo "\r\n原因是:" . $request->reason;
    }

    public function setSupervisor(Manager $manager)
    {
        $this->supervisor = $manager;
    }
}

$departmentManager = new DepartmentManager("部门领导");
$companyManager = new CompanyManager("公司领导");
$superManager = new SuperManager("董事长");
$departmentManager->setSupervisor($companyManager);
$companyManager->setSupervisor($superManager);

$request = new Request("小明", 3, "我想回家回家回家");
$departmentManager->handle($request);
创建于2017年07月13日 18:57
阅读量 490
留言列表

暂时没有留言

添加留言