责任链模式实例:扣除用户金币/写入金币明细/发送消息

Posted 罗夏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了责任链模式实例:扣除用户金币/写入金币明细/发送消息相关的知识,希望对你有一定的参考价值。

功能:

扣除用户金币,写入明细,并发送消息

以上三个动作任意一个动作失败,则请求终止

 

一.定义一个异常类:

class HandleException extends Exception
{
}

  

二.定义一个虚拟类:

abstract class Handle
{
    protected $nextHandle;

    public function setNextHandle(Handle $handle)
    {
        $this->nextHandle = $handle;
    }

    abstract public function handleRequest($request);
}

  

三.用户金币类:

class UserMoney extends Handle
{
    private $uid;
    private $money;

    public function __construct($uid, $money)
    {
        $this->uid      = $uid;
        $this->money    = $money;
    }

    public function handleRequest($request)
    {
        if ($this->money >= $request->money) {
            echo ‘扣除金币成功<br>‘;
            $this->money -= $request->money;

            // 给请求附加新的金币,便于金币明细记录
            $request->newMoney = $this->money;

            if ($this->nextHandle) {
                $this->nextHandle->handleRequest($request);
            }
        } else {
            throw new HandleException(‘金币不足‘, 2001);
        }
    }
}

  

四.金币明细类:

/**
 * 金币明细
 * Class UserMoneyDetail
 */
class UserMoneyDetail extends Handle
{
    public function writeDb($request)
    {
        echo "写入金币明细成功,新的金币数目为{$request->newMoney}<br>";
        return true;
    }

    public function handleRequest($request)
    {
        if ($this->writeDb($request)) {
            if ($this->nextHandle) {
                $this->nextHandle->handleRequest($request);
            }
        } else {
            throw new HandleException(‘金币不足‘, 2002);
        }
    }
}

  

五.发送消息类:

class Message extends Handle
{
    public function sendMessage($request)
    {
        echo "UID为{$request->uid}的用户减少了{$request->money}金币,减少的后金币为{$request->newMoney}";
        return true;
    }

    public function handleRequest($request)
    {
        if (! $this->sendMessage($request)) {
            throw new HandleException(‘发送邮件出错‘, 2003);
        }
    }
}

  

六.调用

$request = (object) [‘uid‘ => 10, ‘money‘ => 500];

try {
    $userMoney          = new UserMoney($request->uid, 300);
    $userMoneyDetail    = new UserMoneyDetail();
    $message            = new Message();

    $userMoney->setNextHandle($userMoneyDetail);
    $userMoneyDetail->setNextHandle($message);

    $userMoney->handleRequest($request);
} catch (HandleException $e) {
    echo "发生错误:{$e->getMessage()}";
}

  

 

以上是关于责任链模式实例:扣除用户金币/写入金币明细/发送消息的主要内容,如果未能解决你的问题,请参考以下文章

Discuz!X3.1如何设置下载附件扣除积分

代理模式+简单工厂或代理模式+策略模式实现开通推广功能

问答项目---金币经验奖励规则及网站配置写入config文件

设计模式 -责任链(附实例)

责任链模式

2015金币