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 函数语法介绍一
Jun 14 PHP
PHP教程 变量定义
Oct 23 PHP
Apache 配置详解(最好的APACHE配置教程)
Jul 04 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
Jan 27 PHP
php addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
深入Memcache的Session数据的多服务器共享详解
Jun 13 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
简单分析ucenter 会员同步登录通信原理
Aug 25 PHP
php中namespace use用法实例分析
Jan 22 PHP
php简单实现多语言切换的方法
May 09 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
Apr 07 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 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
咖啡与牛奶
2021/03/03 冲泡冲煮
浅析PHP 按位与或 (^ 、&amp;)
2013/06/21 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
Google 静态地图API实现代码
2010/11/19 Javascript
JS模拟面向对象全解(二、类型与赋值)
2011/07/13 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
JavaScript实现常用二级省市级联下拉列表的方法
2015/03/25 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
pygame学习笔记(6):完成一个简单的游戏
2015/04/15 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
Python3处理HTTP请求的实例
2018/05/10 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
Python Selenium库的基本使用教程
2021/01/04 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
高中生毕业评语
2014/12/30 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书