声明:本系列博客参考资料《大话设计模式》,作者程杰。

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

UML类图:

角色:

抽象处理者(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}被批准。<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");
//--------------------职责链模式----------------------
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);

适用场景:

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

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

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

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

欢迎关注我的视频课程,地址如下,谢谢。

PHP面向对象设计模式

PHP设计模式——职责链模式相关推荐

  1. Python设计模式-职责链模式

    Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...

  2. 第二十章 Caché 设计模式 职责链模式

    文章目录 第二十章 Caché 设计模式 职责链模式 定义 优点 缺点 结构图 描述 完整示例 请求类 抽象责任类 实现责任类 调用 思考 第二十章 Caché 设计模式 职责链模式 定义 使多个对象 ...

  3. C++设计模式-职责链模式

    目录 基本概念 代码与实例 在哪种地方使用 基本概念 职责链模式(Chain of Responsibility):时多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连 ...

  4. JAVA 设计模式 职责链模式

    用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...

  5. 设计模式|职责链模式--流程状态审批(枚举实现)

    流程审批 在实际的项目中,我们经常会涉及到某个对象实体的状态转换,比如合同审批,请假审批,订单流程状态流转,由于本文不涉及工作流(Activiti,Zeebe)的介绍,只是介绍职责链模式的设计模式,因 ...

  6. C++设计模式——职责链模式(responsibility chain pattern)

    一.原理讲解 1.1意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 1.2应用场景 有多个对象可以处 ...

  7. 设计模式---职责链模式(Chain of Responsibility Pattern)

    目录 1.学校 OA系统采购审批需求 2.传统方式解决审批流程 3.传统 方式 问题分析 4.职责链模式基本介绍 5.职责链模式原理类图 6.职责链模式解决OA采购审批 7.职责链模式在SpringM ...

  8. 设计模式-职责链模式

    1.定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到对象处理它为止.    相信大家都写过if...else或者swit ...

  9. 趣谈设计模式 | 职责链模式(ChainOfResposibility):请求的转发处理

    文章目录 案例:企业信息处理 职责链模式 总结 完整代码与文档 案例:企业信息处理 对于一个企业来说,每天难免的要收到大量的信息,有求职者发送过来的简历.其他公司的商务合作信息.又或者是和一些企业或客 ...

最新文章

  1. 【opencv_python学习之二.五】如何查看opencv_python的函数说明
  2. CentOS下的Memcache安装
  3. Matlab:成功解决Index must be a positive integer or logical
  4. 移动端适配的几种解决办法
  5. 软件或jar包等名字里的GA意思
  6. mysql myflash原理_如何利用 Myflash 解析 binlog ?
  7. 招程序员不要信中医的? | 从编程的角度看中医
  8. Nginx+Tomcat搭建高性能负载均衡集群
  9. php和python-现在自学php和python那个合适?
  10. Security+ 学习笔记23 帐户管理
  11. python爬网站信息_爬取网页信息的小能手——微软PowerBI
  12. jpg、jpeg、png... 的区别
  13. 网易企业邮箱的网易文档是什么?
  14. 裁剪好的视频如何去除黑边?
  15. Xcode8 解决控制台输出
  16. 云原生中间件RocketMQ-核心原理之高可用机制
  17. Kali linux 基础常用指令详解
  18. 并行计算与集群技术(2)
  19. 我对计算机的看法英语作文,我对网络的看法 My Concepts on Internet 英语作文范文...
  20. 2020磺化工艺证考试及磺化工艺考试试题

热门文章

  1. 各部件作用计算机,计算机硬件有哪些部件,各部件的作用是什么?
  2. c语言libjpeg处理图像,解决使用 libjpeg 保存图片时因磁盘写入失败导致程序退出的有关问题...
  3. c# socket接收字符串_php 的 socket简单原理及实现
  4. python装饰器与闭包_Python:函数装饰器和闭包
  5. 纯新手DSP编程--5.30--DSP/BIOS线程
  6. 为什么使用3msip2协议_TCP协议专场
  7. 高中信息技术——Flash动画制作刷题点整理(一)
  8. 高中电子技术——三极管的放大特性和开关特性
  9. oracle优化查询前几条,一个查询优化的分析调整全过程!很值得一看
  10. java常用lib_Java常用工具类整理