php设计模式之责任链模式

作者: xbc 分类: php 发布时间: 2019-01-11 15:21
建立一个对象链来按指定顺序处理调用。如果其中一个对象无法处理命令,它会委托这个调用给它的下一个对象来进行处理,以此类推。
责任链是一种比较高级的行为设计模式,就是当你有一个请求,你不知道用那个方法(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);
标签云