php设计模式之责任链模式
建立一个对象链来按指定顺序处理调用。如果其中一个对象无法处理命令,它会委托这个调用给它的下一个对象来进行处理,以此类推。
责任链是一种比较高级的行为设计模式,就是当你有一个请求,你不知道用那个方法(handler)来处理这个请求时,你可以把这个请求丢进一个责任链里(里面有很多方法),这个责任链会通过轮询的方式自动找到对应的方法。
责任链是一种比较高级的行为设计模式,就是当你有一个请求,你不知道用那个方法(handler)来处理这个请求时,你可以把这个请求丢进一个责任链里(里面有很多方法),这个责任链会通过轮询的方式自动找到对应的方法。
Manager.php
<?php
/**
* Created by PhpStorm.
* User: XBC
* Date: 2019/1/11
* Time: 14:18
*/
namespace Pattern\ChainOfResponsibilities;
/**
* Class Manager
* @package Pattern\ChainOfResponsibilities
* 这个是抽象基类 其中的处理方法必须要在子类中实现
*/
abstract class Manager
{
protected $name;
protected $manager;
public function __construct($name)
{
$this->name = $name;
}
public function setHeader(Manager $manager)
{
$this->manager = $manager;
}
abstract function apply(Request $request);
}
- requerst.php
<?php
/**
* Created by PhpStorm.
* User: XBC
* Date: 2019/1/11
* Time: 14:15
*/
namespace Pattern\ChainOfResponsibilities;
/**
* Class Request
* @package Pattern\ChainOfResponsibilities
* 请求类 定义了基本属性
*/
class Request
{
public $num;
public $type;
public $requestContent;
public function __construct($num,$type,$content)
{
$this->num = $num;
$this->type = $type;
$this->requestContent = $content;
}
}
<?php
/**
* Created by PhpStorm.
* User: XBC
* Date: 2019/1/11
* Time: 14:31
*/
namespace Pattern\ChainOfResponsibilities;
class MajorDomo extends Manager
{
public function __construct($name)
{
parent::__construct($name);
}
public function apply(Request $request)
{
// TODO: Implement apply() method
if ($request->type == '请假' && $request->num <= 5 ) {
echo "{$this->name}:{$request->requestContent} 数量{$request->num}被批准。<br/>";
} else {
if (isset($this->manager)) {
$this->manager->apply($request);
}
}
}
}
<?php
/**
* Created by PhpStorm.
* User: XBC
* Date: 2019/1/11
* Time: 14:23
*/
namespace Pattern\ChainOfResponsibilities;
class CommonManager extends Manager
{
public function __construct($name)
{
parent::__construct($name);
}
public function apply(Request $request)
{
// TODO: Implement apply() method.
if($request->type=="请假" && $request->num<=2)
{
echo "{$this->name}:{$request->requestContent} 数量{$request->num}被批准。<br/>";
}
else
{
if(isset($this->manager))
{
$this->manager->Apply($request);
}
}
}
}
<?php
/**
* Created by PhpStorm.
* User: XBC
* Date: 2019/1/11
* Time: 14:40
*/
namespace Pattern\ChainOfResponsibilities;
class GeneralManager extends Manager
{
public function __construct($name)
{
parent::__construct($name);
}
public function apply(Request $request)
{
// TODO: Implement apply() method.
if ($request->type == "请假")
{
echo "{$this->name}:{$request->requestContent} 数量{$request->num}被批准。<br/>";
}
else if($request->type=="加薪" && $request->num <= 500)
{
echo "{$this->name}:{$request->requestContent} 数量{$request->num}被批准。<br/>";
}
else if($request->type=="加薪" && $request->num>500)
{
echo "{$this->name}:{$request->requestContent} 数量{$request->num}再说吧。<br/>";
}else
{
echo '你自个玩去把'.PHP_EOL;
}
}
}
- 测试代码
<?php
/**
* Created by PhpStorm.
* User: XBC
* Date: 2019/1/11
* Time: 14:48
*/
include "vendor/autoload.php";
use Pattern\ChainOfResponsibilities\CommonManager;
use Pattern\ChainOfResponsibilities\Request;
$jl = new CommonManager('经理');
$zj = new \Pattern\ChainOfResponsibilities\MajorDomo("总监");
$zjl = new \Pattern\ChainOfResponsibilities\GeneralManager('总经理');
// 设置上级
$jl->setHeader($zj);
$zj->setHeader($zjl);
$qj = new Request(2,'请假1','请假玩耍');
$qj2 = new Request(8,'请假','请假玩耍');
$jl->apply($qj);
$jl->apply($qj2);