• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP实现基于状态的责任链审批模式详解

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

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

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

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

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

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

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

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

    (上图:演示界面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数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

    您可能感兴趣的文章:
    • php设计模式 Chain Of Responsibility (职责链模式)
    • PHP设计模式之责任链模式的深入解析
    • 简单介绍PHP的责任链编程模式
    • PHP设计模式之观察者模式(Observer)详细介绍和代码实例
    • php设计模式 Proxy (代理模式)
    • PHP常用的三种设计模式汇总
    • php设计模式 Interpreter(解释器模式)
    • PHP经典面试题之设计模式(经常遇到)
    • php设计模式之单例模式使用示例
    • php 设计模式之 工厂模式
    • php基础设计模式大全(注册树模式、工厂模式、单列模式)
    • php设计模式之职责链模式定义与用法经典示例
    上一篇:Laravel框架实现调用百度翻译API功能示例
    下一篇:php中的buffer缓冲区用法分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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