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 相关文章推荐
第八节 访问方式 [8]
Oct 09 PHP
谈谈新手如何学习PHP
Dec 23 PHP
PHP执行linux系统命令的常用函数使用说明
Apr 27 PHP
屏蔽机器人从你的网站搜取email地址的php代码
Nov 14 PHP
PHP类继承 extends使用介绍
Jan 14 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
May 08 PHP
ThinkPHP的模版中调用session数据的方法
Jul 01 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
Sep 10 PHP
php+jQuery+Ajax简单实现页面异步刷新
Aug 08 PHP
Thinkphp实现站点静态化的方法详解
Mar 21 PHP
thinkPHP框架实现的短信接口验证码功能示例
Jun 20 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
Oct 11 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
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
Javascript !!的作用
2008/12/04 Javascript
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
WdatePicker.js时间日期插件的使用方法
2017/07/26 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
vue动态合并单元格并添加小计合计功能示例
2020/11/26 Vue.js
Java 生成随机字符的示例代码
2021/01/13 Javascript
python实现获取序列中最小的几个元素
2014/09/25 Python
python实现2048小游戏
2015/03/30 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
Python的collections模块真的很好用
2021/03/01 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
视图的作用
2014/12/19 面试题
高中生学习生活的自我评价
2013/10/09 职场文书
大专生简历的自我评价
2013/11/26 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
商务信函英语问候语
2015/11/10 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
nginx+lua单机上万并发的实现
2021/05/31 Servers