php设计模式之职责链模式定义与用法经典示例


Posted in PHP onSeptember 19, 2019

本文实例讲述了php设计模式之职责链模式定义与用法。分享给大家供大家参考,具体如下:

<?php
/**
 * @desc php设计模式之职责链模式(责任链模式)
 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
 * 模拟公司请假流程,实现职责链模式
 * 项目主管:有1天的批假权限
 * 项目经理:有3天的批假权限
 * 公司老板:任性似的权限看心情
 * 此模式有两个角色:1请求员工角色,2领导管理者角色
 * **/
//员工类
class staff{
  public $name;//员工姓名
  public $department;//部门名称
  public $days;//请假天数
  public function __construct($name,$department,$days){
    $this->name = $name;
    $this->department = $department;
    $this->days = $days;
  }
}
//创建抽象管理者类
abstract class manager{
  public $manager;//设置管理者上级
  public function __construct($name){
    $this->name = $name;
  }
  //设置处理申请的上级管理对象
  public function setHeader(manager $manager){
    $this->manager = $manager;
  }
  //请假申请处理方法
  abstract public function apply(staff $staff);
}
//项目经理请假申请处理类
class charge extends manager{
  public $name;//管理者姓名
  public function __construct($name){
    parent::__construct($name);
  }
  /**
   * @desc 审批请假
   * **/
  public function apply(staff $staff){
    if($staff->days<=1){
      echo "{$staff->department}的{$staff->name}你的请假已批准,审批天数{$staff->days},审核人项目主管:{$this->name}".PHP_EOL;
    }else{
      $this->manager->apply($staff);
    }
  }
}
/**
 * @desc 项目经理审批类
 * **/
class projectManager extends manager{
  public function __construct($name){
    parent::__construct($name);
  }
  /**
   * @desc 审批请假
   * **/
  public function apply(staff $staff){
    if($staff->days<=3){
      echo "{$staff->department}的{$staff->name}你的请假已批准,审批天数{$staff->days},审核人项目经理:{$this->name}".PHP_EOL;
    }else{
      $this->manager->apply($staff);
    }
  }
}
/**
 * @desc 老板审批类
 * **/
class boss extends manager{
  public function __construct($name){
    parent::__construct($name);
  }
  /**
   * @desc 审批请假
   * **/
  public function apply(staff $staff){
    if($staff->days>3 && $staff->days<=5 ){
      echo "{$staff->department}的{$staff->name}你的请假已批准,审批天数{$staff->days},审核人ceo:{$this->name}".PHP_EOL;
    }else{
      echo "{$staff->department}的{$staff->name}你的请假天数过长,未批准,审批人ceo:{$this->name}".PHP_EOL;
    }
  }
}
//实例化管理者类
$manager = new charge("尹志平");
$projectManager = new projectManager("令狐冲");
$boss = new boss("风清扬");
//设置管理类的上次管理对象实例
$manager->setHeader($projectManager);
$projectManager->setHeader($boss);
//申请请假1天
$staff = new staff('刘德华', '技术部', 1);
$manager->apply($staff);
//申请请假3天
$staff = new staff('周润发', '技术部', 2);
$manager->apply($staff);
//申请请假5天
$staff = new staff('张学友', '技术部', 5);
$manager->apply($staff);
//申请请假7天
$staff = new staff('刘亦菲', '技术部', 7);
$manager->apply($staff);
/**
拿这个请假的案例通俗的理解就是:每次请假申请都是从最接近自己的领导开始,一层一层的往上递,直到有人处理结束,更通俗的讲就是你给我发一个请求,我如果
有处理权限就直接处理了,如果权限不足就往更上一级别传递直到审核通过结束
 * **/
/*运行结果
技术部的刘德华你的请假已批准,审批天数1,审核人项目主管:尹志平
技术部的周润发你的请假已批准,审批天数2,审核人项目经理:令狐冲
技术部的张学友你的请假已批准,审批天数5,审核人ceo:风清扬
技术部的刘亦菲你的请假天数过长,未批准,审批人ceo:风清扬
*/

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一个程序下载的管理程序(二)
Oct 09 PHP
PHP与javascript的两种交互方式
Oct 09 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
Dec 19 PHP
PHP中的生成XML文件的4种方法分享
Oct 06 PHP
『PHP』PHP截断函数mb_substr()使用介绍
Apr 22 PHP
php解析url的三个示例
Jan 20 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
WordPress过滤垃圾评论的几种主要方法小结
Jul 11 PHP
PHP 读取大文件并显示的简单实例(推荐)
Aug 12 PHP
php base64 编码与解码实例代码
Mar 21 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
Thinkphp5框架异常处理操作实例分析
Jun 03 PHP
php使用yield对性能提升的测试实例分析
Sep 19 #PHP
PHP+redis实现的限制抢购防止商品超发功能详解
Sep 19 #PHP
php+redis实现消息队列功能示例
Sep 19 #PHP
php文件包含的几种方式总结
Sep 19 #PHP
smarty模板的使用方法实例分析
Sep 18 #PHP
PHP MVC框架中类的自动加载机制实例分析
Sep 18 #PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 #PHP
You might like
php笔记之常用文件操作
2010/10/12 PHP
apache php模块整合操作指南
2012/11/16 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
Symfony核心类概述
2016/03/17 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
利用jQuery的$.event.fix函数统一浏览器event事件处理
2009/12/21 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
2010/01/22 Javascript
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python获取一组汉字拼音首字母的方法
2015/07/01 Python
python实现爬取图书封面
2018/07/05 Python
Python requests模块实例用法
2019/02/11 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
python调用百度API实现人脸识别
2020/11/17 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
Weblogc domain问题
2014/01/27 面试题
党的群众路线教育实践活动个人整改措施材料
2014/11/04 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
MYSQL如何查看进程和kill进程
2022/03/13 MySQL