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

功能:

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

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

一.定义一个异常类:

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()}";
}

  

原文地址:https://www.cnblogs.com/itfenqing/p/8729024.html

时间: 2024-08-29 13:41:34

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

责任链模式进阶:与AOP思想的融合与应用

摘要: AOP的理念可以很容易抽象出横切关注点,基于AOP理念我们可以将责任链模式中各具体处理角色中共同的实现责任链结构的行为抽象出来并将其模块化,以便进一步提高代码复用率和系统可维护性.实际上,无论是Java Web中的过滤器,还是Struts2中的Interceptor,它们都是责任链模式与AOP思想互相融合的巧妙实践.为了更进一步理解AOP (Aspect-Oriented Programming,AOP) 和 CoR (Chain of Responsibility),本文还概述了Fil

责任链模式--设计模式

在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假,可批假的领导有部门负责人.副总经理.总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名.电话和地址等信息,这增加了难度.这样的例子还有很多,如找领导出差报销.生活中的“击鼓传花”游戏等. 定义与特点 定义 责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在

Java进阶篇设计模式之八 ----- 责任链模式和命令模式

前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern). 责任链模式 简介 责任链模式顾名思义,就是为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式.在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接

Java设计模式之八 ----- 责任链模式和命令模式

前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern). 责任链模式 简介 责任链模式顾名思义,就是为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式.在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接

php设计模式之责任链模式实现举报功能实例代码

html <html> <head> <meta charset="UTF-8"> <title>责任链模式</title> </head> <body> <h1>责任链模式举报</h1> <form action="09-2.php" method="post"> <select name="lev"

请求的链式处理——责任链模式

什么是责任链模式 职责链能够是一条直线.一个环或者一个树形结构,最常见的职责链是直线型.即沿着一条单向的链来传递请求. 链上的每个对象都是请求处理者.职责链模式能够将请求的处理者组织成一条链.并让请求沿着链传递,由链上的处理者对请求进行对应的处理,client无须关心请求的处理细节以及请求的传递,仅仅需将请求发送到链上就可以,实现请求发送者和请求处理者解耦. 职责链模式定义例如以下: 职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,

设计模式学习笔记(六:责任链模式)

1.1概述 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.这就是责任链模式. 责任链模式是使用多个对象处理用户请求的成熟模式,责任链模式的关键是将用户的请求分派给许多对象,这些对象被组织成一个责任链,即每个对象含有后继对象的引用,并要求责任链上的每个对象,如果能处理用户的请求,就做出处理,不再将用户的请求传递给责任链上的下一个对象:如果不能处理用户的请求,就必须将用户的请求传递给责任链上的下一个对象

责任链模式综述(基础篇)

摘要: 本篇综述责任链模式的提出动机.原理结构.典型实现和应用场景,并结合具体实例展现了其灵活性.可插拔性和松耦合性.首先,结合我们日常生活中"打扑克"的例子引出了责任链模式产生动机,并揭示了其应用场景.紧接着,我们概述了责任链模式的内涵和结构,即通过建立一条责任链来组织请求的处理者,请求将沿着链进行传递,而请求发送者无须知道请求在何时.何处以及如何被处理,实现了请求发送者与处理者的解耦.此外,本文给出了责任链模式的典型实现和并结合具体实例介绍其使用方式,以便我们更好体会其优点. 版权

.NET责任链模式(混合单例模式,模板方法模式)-----制作与扩展能力验证

.NET责任链模式.单例模式.模板方法模式混用 前言 哇,看到题目挺长的,这个组合型的东西,到底能干啥呢?本篇文章来一起琢磨琢磨,这两天为了团队的软件赶工,我负责的那一块叫:插件管理器.我们团队的成员用的语言还是挺分散的,本人C#,队长VB.NET,还有其他成员写易语言等,系统的功能插件是我们分开写的,各自用各自的喜欢的语言写各个功能模块的插件,最后用我开发的插件管理器把所有的插件整合到一起.这让我很头疼啊,一个C#版的插件,一个VB.NET版的插件,一个易语言的插件,如果有新成员加入,又来个P