加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_郴州站长网 (http://www.0735zz.com/)- 云通信、区块链、物联设备、云计算、站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

畅聊PHP中的责任链模式

发布时间:2022-07-12 13:05:22 所属栏目:PHP教程 来源:互联网
导读:责任链模式,属于对象行为型的设计模式。 Gof类图及解释 GoF定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 GoF类图: 1.jpg 代码实现 abstrac
  责任链模式,属于对象行为型的设计模式。
 
  Gof类图及解释
  GoF定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
 
  GoF类图:
 
  1.jpg
 
  代码实现
 
  
  abstract class Handler
 
  {
 
      protected $successor;
 
      public function setSuccessor($successor)
 
      {
 
          $this->successor = $successor;
 
      }
 
      abstract public function HandleRequst($request);
 
  }
 
  定义抽象责任链类,使用$successor保存后继链条。
 
 
 
  
 
  class ConcreteHandler1 extends Handler
 
  {
 
      public function HandleRequst($request)
 
      {
 
          if (is_numeric($request)) {
 
              return '请求参数是数字:' . $request;
 
          } else {
 
              return $this->successor->HandleRequst($request);
 
          }
 
      }
 
  }
 
   
 
  class ConcreteHandler2 extends Handler
 
  {
 
      public function HandleRequst($request)
 
      {
 
          if (is_string($request)) {
 
              return '请求参数是字符串:' . $request;
 
          } else {
 
              return $this->successor->HandleRequst($request);
 
          }
 
      }
 
  }
 
   
 
  class ConcreteHandler3 extends Handler
 
  {
 
      public function HandleRequst($request)
 
      {
 
          return '我也不知道请求参数是啥了,你猜猜?' . gettype($request);
 
      }
 
  }
 
  三个责任链条的具体实现,主要功能是判断传入的数据类型,如果是数字由第一个类处理,如果是字符串,则第二个类处理。如果是其他类型,第三个类统一处理。
 
 
  
  $handle1 = new ConcreteHandler1();
 
  $handle2 = new ConcreteHandler2();
 
  $handle3 = new ConcreteHandler3();
 
   
 
  $handle1->setSuccessor($handle2);
 
  $handle2->setSuccessor($handle3);
 
   
 
  $requests = [22, 'aaa', 55, 'cc', [1, 2, 3], null, new stdClass];
 
   
 
  foreach ($requests as $request) {
 
      echo $handle1->HandleRequst($request) . PHP_EOL;
 
  }
 
  客户端的调用,依次实例化三个责任链实例,并指定链条成员。创建请求参数,之后通过责任链来进行结果判断。
 
  责任链非常适合的一种场景,就是对请求参数进行逐层过滤,就像我们工作时使用钉钉之类的办公软件。当需要提加班或者休假申请时,那一层层的审批流程就是对这个模式最完美的解释
  我们可以拦截请求,直接返回,也可以对请求内容进行完善修改交给下一个类来进行处理,但至少有一个类是要返回结果的。
  请求不一定都会被处理,也有可能完全不处理就返回或者传递给下一个处理类来进行处理
  我们一直在说手机制造这个行业,之前我们一直是交给代工厂来进行手机的组装生产,这回,我们自己建立了一条流水线。而这个流水线,就非常像责任链模式,怎么说呢,从一台手机的装配说起。有操作员将手机主板(初始请求)放到流水线上,然后工人开始添加内存、CPU、摄像头(各种责任链条类进行处理),期间也会经过测试和调整以达到最佳出厂性能。最后拼装成一台完整的手机交到客户的手中,这种工作流是不是和责任链非常相似呢!!

(编辑:开发网_郴州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读