【PHP-设计模式】职责链模式

版权声明:咔咔 来自https://blog.csdn.net/fangkang7 https://blog.csdn.net/fangkang7/article/details/84541431

author:咔咔

WeChat:fangkangfk

什么是职责链模式:

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

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

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

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

在抽象类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);



猜你喜欢

转载自blog.csdn.net/fangkang7/article/details/84541431
今日推荐