zl程序教程

您现在的位置是:首页 >  其他

当前栏目

php设计模式-责任链模式

2023-04-18 13:14:11 时间

最近重构代码发现责任链模式非常实用,所以简单总结了一下。总体来说,责任链模式更像是一种简化多种场景下调用处理的一种设计模式,特别适合if-else分支判断很多的场景。比如是根据不同会员等级给予不同的优惠力度。

它的定义:对象的调用是由下家的应用连接起来的处理链。一直不断在链上传递,直到有某个对象可以处理为止。

 

我个人的理解:就像一个人要举报某个高官贪污,要先从当地法院进行提案举报,当地法院权限不足,然后将这个事儿继续上报给中级人民法院,中级人民法院发现无权处理,又把举报再上报给最高法,in the end 最高法依法受理。

 

它的好处:

1.解耦。使用单一职责的处理类去处理不同场景条件下的业务,达到解耦,方便后期扩展和维护。

2.客户端无感。请求方不用知道具体是哪个处理类完成了请求处理,将处理过程交给系统内部。

3.可扩展性。可以动态重新组织链式和分配责任,当有新的case的时候就增加一个节点处理类即可,不用改变调用过程。

 

 具体例子如下:

<?php
/**
 * Created by PhpStorm.
 * User: tonny
 */

abstract class Handler {
    protected $higher = null;
    abstract public function operation($lev);
}

// 房间主人
class RoomMaster extends Handler { protected $higher = "admin"; public function operation($lev) { // TODO: Implement operation() method. if ($lev <= 1) { echo "房间主人搞定!"; } else { $higher = $this->higher; $this->higher = new $higher(); $this->higher->operation($lev); } } }
// 管理员
class Admin extends Handler { protected $higher = "God"; public function operation($lev) { // TODO: Implement operation() method. if ($lev <= 50) { echo "Admin搞定"; } else { echo "God搞定"; } } } $try = new RoomMaster(); $lev = rand(0, 100); $try->operation($lev);

总结:利用php的动态特性,将下一个节点的类保存在每个处理类中的$higher变量中,通过$lev来判断是当前处理类是否处理得过来,如果能处理则处理,不能处理则交给$higher。