PHP实现基于状态的责任链审批模式详解


Posted in PHP onMay 31, 2019

本文实例讲述了PHP实现基于状态的责任链审批模式。分享给大家供大家参考,具体如下:

我们开发网站,除了前后,还有后台,除了内容管理,很多时候要涉及到『审批』。

比如:商务部要做个专题推广活动,活动中需要调用一些商品做优惠。

1、商务部编辑先写文案
2、商务部领导审批文案内容
3、商品部领导需要审批商品的价格和库存(万一没货呢)
4、后面可能还有好多领导要审批(带扩展)

今天我们要引入的模式是『责任链模式』

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来,形成一条链条。请求在这个链条上传递,知道链条上的某一个对象决定处理次请求。发出这个请求的客户端并不知道链条上哪一个对象最终处理这个请求。

为了演示方便,我们做价格设定。

1、假定层级关系是:商品部领导>商务部领导>编辑
2、假设只能一级级审批(也就是不能跳级,仅为了演示方便)
3、这里审批暂时不能回退

PHP实现基于状态的责任链审批模式详解

(上图:演示界面show.php)

show.php:

<?php
  require('subject.php');
  if ($_GET){
    if (isset($_GET['createSubject'])){ //点击创建文案后执行
      $subject = new subject();
      $subject->content = '文案的内容';
      $subject->save();
    }
  }
?>
<html>
  <head>
    <title>责任链-审批</title>
    <style>
      *{marign:0;padding:0}
      .container{width:100%;margin: 0 auto;text-align: center}
    </style>
  </head>
  <body>
    <div class="container">
      <div><h2>流程演示界面</h2></div>
      <form method="get" action="show.php">
        <div class="row">
          <textarea name="" id="" cols="30" rows="10"></textarea>
          <div>
            <button name="createSubject">编辑创建文案</button>
          </div>
        </div>
        <div class="row">
          <hr>
          <button name="step">领导审批</button>
        </div>
      </form>
    </div>
  </body>
</html>

编辑点击『创建文案』提交内容,然后把文案写到到本地json文件(保存)。文案的主题是subject.php:

<?php
class subject
{
  public $content = ''; //文案内容
  public $state = 0; //初试状态
  /**
   * 保存内容(编辑保存)
   */
  public function save(){
    //我们这里保存到本地文件
    file_put_contents(__DIR__.'/subject.json',json_encode($this));
    echo '文案已经创建成功';
  }
}

这个时候文案已经创建好了,需要进入审批

抽象类(领导)manager.php :

<?php
abstract class manager
{
  public $subject; //加载专题内容
  public $mystate=0; //当前状态,这个很重要
  public $leader=false; //重要,设置自己的领导是谁
  public $myname = ''; //当前审批者的名字
  /**
   * 设置领导是谁
   * @param $leader
   */
  public function setLeader($leader)
  {
    $this->leader = $leader; //形成责任链的关键
  }
  public function __construct()
  {
    $str = file_get_contents(__DIR__.'/subject.json');
    $this->subject = json_decode($str);
  }
  public function step($msg)
  {
    //很重要,代表审批
    //只有当subject的state和自己的mystate相等是才会处理
    if ($this->subject->state == $this->mystate){ //代表当前是自己要处理的
      //在这执行审批通过的 具体
      echo $msg . '审批制是:'.$this->myname;
      //判断自己的是否有领导,如果有把控制权交给领导
      if ($this->leader){
        $this->subject->state = $this->leader->mystate; //交控制权
        file_put_contents(__DIR__.'/subject.json',json_encode($this->subject)); //保存状态
      }else{
        echo '审批已经结束';
      }
    }else{
      if ($this->leader){ //leader就是维护整个类的 链
        //让自己的领导去审批
        $this->leader->step($msg);
      }
    }
  }
}

商务部领导,商品部领导,大boss都要继承这个抽象类。

BusinessLeader.php

<?php
class BusinessLeader extends manager
{
  public $myname = '商务部领导';
  public $mystate = 0;
}

ProductLeader.php:

<?php
class ProductLeader extends manager
{
  public $myname = '商品部领导';
  public $mystate = 1;
}

LastLeader.php

<?php
class LastLeader extends manager
{
  public $myname = '终极领导';
  public $mystate = 2;
}

在编辑提交文案之后,会进入『领导审批』阶段:

if (isset($_GET['step'])){ //进入领导审批阶段了
  //这里面最关键是
   //1.确定第一个领导是谁
   //2. 要维护各个领导直接的关系,
   require ('manager.php');
   require ('BusinessLeader.php');
   require ('ProductLeader.php');
   require ('LastLeader.php');
   $businessLeader = new BusinessLeader();
   $productLeader = new ProductLeader();
   $lastLeader = new LastLeader();
   //下面还是维护关系
   $businessLeader->setLeader($productLeader);
   $productLeader->setLeader($lastLeader);
   $businessLeader->step('审批通过');
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用IE远程创建Mysql数据库的简易程序
Oct 09 PHP
一些关于PHP的知识
Nov 17 PHP
php 静态页面中显示动态内容
Aug 14 PHP
php 上一篇,下一篇文章实现代码与原理说明
May 09 PHP
关于PHP递归算法和应用方法介绍
Apr 15 PHP
php获取汉字首字母的函数
Nov 07 PHP
PHP中new static() 和 new self() 的区别介绍
Jan 09 PHP
php实现httpRequest的方法
Mar 13 PHP
Thinkphp和onethink实现微信支付插件
Apr 13 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
Mar 27 PHP
Yii 使用intervention/image拓展实现图像处理功能
Jun 22 PHP
Laravel框架实现调用百度翻译API功能示例
May 30 #PHP
Laravel框架学习笔记之批量更新数据功能
May 30 #PHP
PHP实现的微信公众号扫码模拟登录功能示例
May 30 #PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 #PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
May 29 #PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
May 29 #PHP
PHP微信网页授权的配置文件操作分析
May 29 #PHP
You might like
PHP的FTP学习(四)
2006/10/09 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
2017/10/09 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
小程序视频列表中视频的播放与停止的示例代码
2018/07/20 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
python中int与str互转方法
2018/07/02 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
Django中的session用法详解
2020/03/09 Python
python如何使用代码运行助手
2020/07/03 Python
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
优秀毕业生推荐信
2013/11/02 职场文书
三年级学生评语
2014/04/23 职场文书
幼儿园课题方案
2014/06/09 职场文书
拉歌口号大全
2014/06/13 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python