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的面试题集,附我的答案和分析(一)
Nov 19 PHP
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
Oct 31 PHP
PHP 最大运行时间 max_execution_time修改方法
Mar 08 PHP
php学习之变量的使用
May 29 PHP
PHP数据类型之布尔型的介绍
Apr 28 PHP
win7下memCache的安装过程(具体操作步骤)
Jun 28 PHP
yii操作cookie实例简介
Jul 09 PHP
PHP实现图片旋转效果实例代码
Oct 01 PHP
php购物车实现方法
Jan 03 PHP
10条php编程小技巧
Jul 07 PHP
php算法实例分享
Jul 14 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
Dec 24 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企业级应用之常见缓存技术篇
2011/01/27 PHP
php实现httpclient类示例
2014/04/08 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
js 连接数据库如何操作数据库中的数据
2012/11/23 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
JS实现页面侧边栏效果探究
2021/01/08 Javascript
Python字符遍历的艺术
2008/09/06 Python
python爬取个性签名的方法
2018/06/17 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
五水共治捐款倡议书
2014/05/14 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
2015年公务员工作总结
2015/04/24 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS