PHP设计模式——职责链模式
声明:本系列博客参考资料《大话设计模式》,作者程杰。
职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。
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设计模式——职责链模式相关推荐
- Python设计模式-职责链模式
Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...
- 第二十章 Caché 设计模式 职责链模式
文章目录 第二十章 Caché 设计模式 职责链模式 定义 优点 缺点 结构图 描述 完整示例 请求类 抽象责任类 实现责任类 调用 思考 第二十章 Caché 设计模式 职责链模式 定义 使多个对象 ...
- C++设计模式-职责链模式
目录 基本概念 代码与实例 在哪种地方使用 基本概念 职责链模式(Chain of Responsibility):时多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连 ...
- JAVA 设计模式 职责链模式
用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...
- 设计模式|职责链模式--流程状态审批(枚举实现)
流程审批 在实际的项目中,我们经常会涉及到某个对象实体的状态转换,比如合同审批,请假审批,订单流程状态流转,由于本文不涉及工作流(Activiti,Zeebe)的介绍,只是介绍职责链模式的设计模式,因 ...
- C++设计模式——职责链模式(responsibility chain pattern)
一.原理讲解 1.1意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 1.2应用场景 有多个对象可以处 ...
- 设计模式---职责链模式(Chain of Responsibility Pattern)
目录 1.学校 OA系统采购审批需求 2.传统方式解决审批流程 3.传统 方式 问题分析 4.职责链模式基本介绍 5.职责链模式原理类图 6.职责链模式解决OA采购审批 7.职责链模式在SpringM ...
- 设计模式-职责链模式
1.定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到对象处理它为止. 相信大家都写过if...else或者swit ...
- 趣谈设计模式 | 职责链模式(ChainOfResposibility):请求的转发处理
文章目录 案例:企业信息处理 职责链模式 总结 完整代码与文档 案例:企业信息处理 对于一个企业来说,每天难免的要收到大量的信息,有求职者发送过来的简历.其他公司的商务合作信息.又或者是和一些企业或客 ...
最新文章
- 【opencv_python学习之二.五】如何查看opencv_python的函数说明
- CentOS下的Memcache安装
- Matlab:成功解决Index must be a positive integer or logical
- 移动端适配的几种解决办法
- 软件或jar包等名字里的GA意思
- mysql myflash原理_如何利用 Myflash 解析 binlog ?
- 招程序员不要信中医的? | 从编程的角度看中医
- Nginx+Tomcat搭建高性能负载均衡集群
- php和python-现在自学php和python那个合适?
- Security+ 学习笔记23 帐户管理
- python爬网站信息_爬取网页信息的小能手——微软PowerBI
- jpg、jpeg、png... 的区别
- 网易企业邮箱的网易文档是什么?
- 裁剪好的视频如何去除黑边?
- Xcode8 解决控制台输出
- 云原生中间件RocketMQ-核心原理之高可用机制
- Kali linux 基础常用指令详解
- 并行计算与集群技术(2)
- 我对计算机的看法英语作文,我对网络的看法 My Concepts on Internet 英语作文范文...
- 2020磺化工艺证考试及磺化工艺考试试题
热门文章
- 各部件作用计算机,计算机硬件有哪些部件,各部件的作用是什么?
- c语言libjpeg处理图像,解决使用 libjpeg 保存图片时因磁盘写入失败导致程序退出的有关问题...
- c# socket接收字符串_php 的 socket简单原理及实现
- python装饰器与闭包_Python:函数装饰器和闭包
- 纯新手DSP编程--5.30--DSP/BIOS线程
- 为什么使用3msip2协议_TCP协议专场
- 高中信息技术——Flash动画制作刷题点整理(一)
- 高中电子技术——三极管的放大特性和开关特性
- oracle优化查询前几条,一个查询优化的分析调整全过程!很值得一看
- java常用lib_Java常用工具类整理