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发明人谈MVC和网站设计架构 貌似他不支持php用mvc
Jun 04 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
Jul 01 PHP
PHP测试程序运行时间的类
Feb 05 PHP
php preg_filter执行一个正则表达式搜索和替换
Feb 27 PHP
php preg_replace替换实例讲解
Nov 04 PHP
使用PHP静态变量当缓存的方法
Nov 13 PHP
CI(CodeIgniter)框架中的增删改查操作
Jun 10 PHP
phplot生成图片类用法详解
Jan 06 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
PHP PDOStatement::errorCode讲解
Jan 31 PHP
PHP数组基本用法与知识点总结
Jun 02 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
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
2014/04/10 PHP
一个php短网址的生成代码(仿微博短网址)
2014/05/07 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
php简单截取字符串代码示例
2016/10/19 PHP
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
2016/10/11 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
layer.js之回调销毁对话框的例子
2019/09/11 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
Python字符串处理之count()方法的使用
2015/05/18 Python
Python进程间通信之共享内存详解
2017/10/30 Python
python操作kafka实践的示例代码
2019/06/19 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
python实现静态服务器
2019/09/05 Python
python实现字符串和数字拼接
2020/03/02 Python
python logging通过json文件配置的步骤
2020/04/27 Python
python进行参数传递的方法
2020/05/12 Python
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
寒假实习自荐信
2014/01/26 职场文书
财务务虚会发言材料
2014/10/20 职场文书
党员民主生活会材料
2014/12/15 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
redis哨兵常用命令和监控示例详解
2021/05/27 Redis