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 相关文章推荐
珊瑚虫IP库浅析
Feb 15 PHP
不要轻信 PHP_SELF的安全问题
Sep 05 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
PHP中cookie和session的区别实例分析
Aug 28 PHP
PHP常用的小程序代码段
Nov 14 PHP
PHP创建PowerPoint2007文档的方法
Dec 10 PHP
php读取torrent种子文件内容的方法(测试可用)
May 03 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
php查找字符串中第一个非0的位置截取
Feb 27 PHP
php文件上传类的分享
Jul 06 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
Sep 11 PHP
laravel框架创建授权策略实例分析
Nov 22 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面试题(对属性或方法的访问控制)
2012/09/13 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
基于jquery实现的仿优酷图片轮播特效代码
2016/01/13 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
Node.js中的cluster模块深入解读
2018/06/11 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
python操作 hbase 数据的方法
2016/12/18 Python
Python 基础知识之字符串处理
2017/01/06 Python
Java及python正则表达式详解
2017/12/27 Python
python+flask实现API的方法
2018/11/21 Python
softmax及python实现过程解析
2019/09/30 Python
python sorted方法和列表使用解析
2019/11/18 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
新闻发布会主持词
2014/03/28 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
志愿者工作心得体会
2016/01/15 职场文书
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL