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&amp;&amp;mysql)三
Oct 09 PHP
用DBSQL类加快开发MySQL数据库程序的速度
Oct 09 PHP
Smarty模板快速入门
Jan 04 PHP
PHP 超链接 抓取实现代码
Jun 29 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
Apr 15 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
PHP添加Xdebug扩展的方法
Feb 12 PHP
php线性表的入栈与出栈实例分析
Jun 12 PHP
Yii中srbac权限扩展模块工作原理与用法分析
Jul 14 PHP
Yii2框架中日志的使用方法分析
May 22 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 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中养成7个面向对象的好习惯
2010/07/17 PHP
thinkphp实现图片上传功能
2016/01/13 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
javascript实现的listview效果
2007/04/28 Javascript
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
2010/10/01 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
vue 利用路由守卫判断是否登录的方法
2018/09/29 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
Python入门学习指南分享
2018/04/11 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
Python异常的检测和处理方法
2018/10/26 Python
python微信撤回监测代码
2019/04/29 Python
关于python3中setup.py小概念解析
2019/08/22 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
商务英语专业应届毕业生求职信
2013/10/28 职场文书
应届毕业生自荐信例文
2014/02/26 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
青年文明号服务承诺
2014/03/31 职场文书
技能比武方案
2014/05/21 职场文书