php设计模式之责任链模式
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}被批准。<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设计模式之责任链模式的更多相关文章
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- python设计模式之责任链模式
python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...
- 【GOF23设计模式】责任链模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 package com.test.chainO ...
- C#设计模式:责任链模式
设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...
- 详解java设计模式之责任链模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...
- Head First设计模式之责任链模式
一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求 ...
- 【Unity与23种设计模式】责任链模式(Chain of Responsibility)
GoF中定义: "让一群对象都有机会来处理一项请求,以减少请求发送者与接收者之间的耦合度.将所有的接受对象串联起来,让请求沿着串接传递,直到有一个对象可以处理为止." 举个现实中的 ...
- Java进阶篇设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
- 设计模式之责任链模式——Java语言描述
责任链模式为请求创建了一个接受者对象的链.这种模式给予请求的类型,对请求的发送者和接受者进行解耦.这种类型的设计模式属于行为模式.在这种模式下,通常每个接收者都包含对另一个接收者的引用.如果一个对象不 ...
随机推荐
- listView 多个item布局
package kds.szkingdom.wo.android.adapter; import java.util.List; import android.content.Context; imp ...
- java.lang.NoClassDefFoundError: javax/servlet/ServletInputStream
转自:https://blog.csdn.net/y970105/article/details/355401 进入 tomcat根目录/lib/servlet-api.jar复制出来,放到JDK_P ...
- 在nodejs使用Redis缓存和查询数据及Session持久化(Express)
在nodejs使用Redis缓存和查询数据及Session持久化(Express) https://segmentfault.com/a/1190000002488971
- JQuery 登录窗口的布局
<!-- Button trigger modal --><button type="button" class="btn btn-primary bt ...
- Core Java(三)
三.运算符&流程控制 运算符---http://blog.csdn.net/typa01_kk/article/details/45000535 在一个程序执行的过程中,各条语句的执行顺序对程 ...
- 关于iOS11上MJRefresh tabview刷新后,重新加载另一组数据, 回不到顶部或者头尾显示混乱等问题解决
MJRefresh在iOS11上存在很多bug 比如在iphoenx上首尾仍会显示的问题 刷新数据后tableview置顶不上去等问题 虽然官方给出了适配方案 但是问题还没有的到解决 比如tabvi ...
- where条件顺序与建索引顺序
查询时,如果数据量很大,where 后面的条件与建索引的顺序相同,也没有什么多少差别,聚集索引稍微快点; 但where 后面的条件与建索引顺序不同,速度会慢下来,到底慢多少,不同的机器会不一样,没有绝 ...
- ajax返回值
前端: <html> <head> <meta name="viewport" content="width=device-width&qu ...
- 查看网站域名IP地址
运行:CMD 输入: Nslookup 网站地址 示例: Nslookup httpwww.baidu.com 我们是筑梦团队,我们的座右铭是:当提起逐梦的脚步,也请举起筑梦的双手
- java中端口号被占用的解决办法
第一步,命令提示符号,执行命令:netstat -ano 可见,占用1099端口的进程的PID是10460. 第二步,命令提示符号,执行命令:tasklist(通过pid 10460定位) 可见,该占 ...