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实现文件上传二法
Oct 09 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
PHP下通过系统信号量加锁方式获取递增序列ID
Sep 25 PHP
php面向对象全攻略 (四)构造方法与析构方法
Sep 30 PHP
调整优化您的LAMP应用程序的5种简单方法
Jun 26 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
Jun 25 PHP
php输入流php://input使用浅析
Sep 02 PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 PHP
php树型类实例
Dec 05 PHP
php批量删除cookie的简单实现方法
Jan 26 PHP
PHP实现清除MySQL死连接的方法
Jul 23 PHP
PHP简单实现防止SQL注入的方法
Mar 13 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打开远程文件的方法和风险及解决方法
2013/11/12 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
javascript判断单选框或复选框是否选中方法集锦
2007/04/04 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
[01:52]PWL S2开团时刻第四期——DOTA2成语故事
2020/12/03 DOTA
python安装教程 Pycharm安装详细教程
2017/05/02 Python
python 连接sqlite及简单操作
2017/06/30 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
Python socket 套接字实现通信详解
2019/08/27 Python
python几种常用功能实现代码实例
2019/12/25 Python
python集合能干吗
2020/07/19 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
办公室秘书自我鉴定
2014/01/18 职场文书
学校卫生检查制度
2014/02/03 职场文书
材料员岗位职责范本
2015/04/11 职场文书
离婚案件原告代理词
2015/05/23 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server