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之第七天
Oct 09 PHP
global.php
Dec 09 PHP
dedecms中常见问题修改方法总结
Mar 21 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
Jan 27 PHP
在PHP中使用redis
Nov 04 PHP
PHP跨平台获取服务器IP地址自定义函数分享
Dec 29 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
Yii2中DropDownList简单用法示例
Jul 18 PHP
laravel学习教程之存取器
Jul 30 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
Laravel框架模板继承操作示例
Jun 11 PHP
thinkPHP5使用Rabc实现权限管理
Aug 28 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
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
&amp;lt;script defer&amp;gt; defer 是什么意思
2009/05/10 Javascript
Javascript 读书笔记索引贴
2010/01/11 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
python文件的md5加密方法
2016/04/06 Python
Python出现segfault错误解决方法
2016/04/16 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
印度购物网站:TATA CLiQ
2017/11/23 全球购物
大学团支书的自我评价分享
2013/12/14 职场文书
婚礼主持词
2014/03/13 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
学生个人评语大全
2015/01/04 职场文书
匿名信格式范文
2015/05/27 职场文书
鸡毛信观后感
2015/06/11 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
MySQL快速插入一亿测试数据
2021/06/23 MySQL
SQL Server 中的事务介绍
2022/05/20 SQL Server