首页 > php教程 > php手册 > 正文

PHP设计模式职责链模式

php中文网
发布: 2016-06-13 09:01:41
原创
1009人浏览过

PHP设计模式——职责链模式

 

立即学习PHP免费学习笔记(深入)”;

 

立即学习PHP免费学习笔记(深入)”;

 

立即学习PHP免费学习笔记(深入)”;

职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。

 

立即学习PHP免费学习笔记(深入)”;

UML类图:

 

立即学习PHP免费学习笔记(深入)”;

角色:

抽象处理者(Manager):定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。

具体处理者(CommonManager):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。


核心代码:

<!--?php
/**
 * Created by PhpStorm.
 * User: Jang
 * Date: 2015/6/11
 * Time: 10:16
 */

//申请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}被批准。
;
        }
        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}被批准。
;
        }
        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}被批准。
;
        }
        else if($_req->requestType==加薪 && $_req->num <= 500)
        {
            echo {$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。
;
        }
        else if($_req->requestType==加薪 && $_req->num>500)
        {
            echo {$this->name}:{$_req->requestContent} 数量{$_req->num}再说吧。
;
        }
    }
}

登录后复制

 

立即学习PHP免费学习笔记(深入)”;

调用客户端代码:

 

立即学习PHP免费学习笔记(深入)”;

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

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

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

$req2 = new Request();
$req2->requestType = 请假;
$req2->requestContent = 小菜请假!;
$req2->num = 4;
$jingli->Apply($req2);

$req3 = new Request();
$req3->requestType = 加薪;
$req3->requestContent = 小菜请求加薪!;
$req3->num = 500;
$jingli->Apply($req3);

$req4 = new Request();
$req4->requestType = 加薪;
$req4->requestContent = 小菜请求加薪!;
$req4->num = 1000;
$jingli->Apply($req4);
登录后复制

适用场景:

 

立即学习PHP免费学习笔记(深入)”;

1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

3、可动态指定一组对象处理请求。


至此,PHP设计模式系列教程全部更新结束,欢迎大家批评指正。你的只言片语是我前进的动力。

 

立即学习PHP免费学习笔记(深入)”;

 

立即学习PHP免费学习笔记(深入)”;


PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号