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 相关文章推荐
隐性调用php程序的方法
Mar 09 PHP
基于php冒泡排序算法的深入理解
Jun 09 PHP
php获取textarea的值并处理回车换行的方法
Oct 20 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
set_exception_handler函数在ThinkPHP中的用法
Oct 31 PHP
php计算两个日期相差天数的方法
Mar 14 PHP
培养自己的php编码规范
Sep 28 PHP
利用PHP判断是否是连乘数字串的方法示例
Jul 03 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
Laravel模糊查询区分大小写的实例
Sep 29 PHP
php上传后台无法收到数据解决方法
Oct 28 PHP
php post换行的方法
Feb 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中文字符截取防乱码
2008/03/28 PHP
php 设计模式之 工厂模式
2008/12/19 PHP
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
php上传文件常见问题总结
2015/02/03 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
TypeScript类型声明书写详解
2019/08/28 Javascript
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
python批量创建指定名称的文件夹
2019/03/21 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
解决python 文本过滤和清理问题
2019/08/28 Python
使用TensorFlow对图像进行随机旋转的实现示例
2020/01/20 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
护士辞职信模板
2014/01/20 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书