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 相关文章推荐
php设计模式 Decorator(装饰模式)
Jun 26 PHP
解析dedeCMS验证码的实现代码
Jun 07 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
Zend Framework动作助手Json用法实例分析
Mar 05 PHP
thinkPHP3.1验证码的简单实现方法
Apr 22 PHP
Yii2使用自带的UploadedFile实现的文件上传
Jun 20 PHP
微信利用PHP创建自定义菜单的方法
Aug 01 PHP
php版微信自动获取收货地址api用法示例
Sep 22 PHP
php字符串操作常见问题小结
Oct 11 PHP
Yii2配置Nginx伪静态的方法
May 05 PHP
laravel 时间格式转时间戳的例子
Oct 11 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
Jan 04 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的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
PHP限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
php实现爬取和分析知乎用户数据
2016/01/26 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
Seajs源码详解分析
2019/04/02 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
python检测IP地址变化并触发事件
2018/12/26 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
python中random模块详解
2021/03/01 Python
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
大学生个人求职信范文
2013/09/21 职场文书
法院授权委托书格式
2014/09/28 职场文书
毕业生政审意见范文
2015/06/04 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
vue使用element-ui按需引入
2022/05/20 Vue.js