author:咔咔

什么是职责链模式:

职责链模式是包含了一些命令对象和一些处理对象,每个处理对象决定他能处理的那些命令对象,它也知道把自己不能处理的命令对象移交给下一个处理对象

白话解释:

这个案例一共三个职位,是经理,总监,总经理,职位就类似命令对象,请假这件事就类似命令对象,当经理处理不了的事情就需要移交给总监,总监处理的不了的事情就需要移交给总经理,这也就是我们的职责链模式

下来我们分段来解释这个案例

首先这个案例分为三部分第一部分是声明的属性,第二部分是抽象类里边设置上下级关系,抽象方法,第三部分就是业务方面的代码

在抽象类manage这个类中apply抽象方法中注入了request这个类

当请假数量大于2的时候经理的职权就不够了,这个时候就会走apply这个方法,this->manage这个属性是获取的对应职位的上级的类,然后在调用自己的处理函数方法完成逻辑处理,如还没有权限则继续追寻上级,直到权限满足返回处理结果即可

<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/11/26
* Time: 14:04
*/
//申请Model
class Request
{
//数量
public $num;
//申请类型
public $requestType;
//申请内容
public $requestContent;
}

//抽象管理者
abstract class Manager
{
protected $name;
//管理者上级
protected $manager;
public function __construct($_name)
{
$this->name = $_name;
}

//设置管理者上级
public function SetHeader(Manager $_mana)
{
$this->manager = $_mana;
}

//申请请求
abstract public function Apply(Request $_req);

}

//经理
class CommonManager extends Manager
{
public function __construct($_name)
{
parent::__construct($_name);
}
public function Apply(Request $_req)
{
if($_req->requestType=="请假" && $_req->num<=2)
{
echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
}
else
{
if(isset($this->manager))
{
$this->manager->Apply($_req);
}
}

}
}

//总监
class MajorDomo extends Manager
{
public function __construct($_name)
{
parent::__construct($_name);
}

public function Apply(Request $_req)
{
if ($_req->requestType == "请假" && $_req->num <= 5)
{
echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
}
else
{
if (isset($this->manager))
{
$this->manager->Apply($_req);
}
}

}
}


//总经理
class GeneralManager extends Manager
{
public function __construct($_name)
{
parent::__construct($_name);
}

public function Apply(Request $_req)
{
if ($_req->requestType == "请假")
{
echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
}
else if($_req->requestType=="加薪" && $_req->num <= 500)
{
echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
}
else if($_req->requestType=="加薪" && $_req->num>500)
{
echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}再说吧。<br/>";
}
}
}

header("Content-Type:text/html;charset=utf-8");
//--------------------职责链模式----------------------
$jingli = new CommonManager("李经理");
$zongjian = new MajorDomo("郭总监");
$zongjingli = new GeneralManager("孙总");

//设置直接上级
$jingli->SetHeader($zongjian);
$zongjian->SetHeader($zongjingli);

//申请
$req1 = new Request();
$req1->requestType = "请假";
$req1->requestContent = "小菜请假!";
$req1->num = 20;
$jingli->Apply($req1);