好玩的基于状态的责任链审批模式

本文介绍了一个基于责任链模式的审批流程实现案例。该案例详细解释了如何使用PHP语言搭建一个包含多个审批环节的系统,从文案创建到多级领导审批的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们开发网站,除了前后,还有后台,除了内容管理,很多时候要涉及到『审批』。
比如:商务部要做个专题推广活动,活动中需要调用一些商品做优惠。
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('审批通过');
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值