【PHP-设计模式】职责链模式

举报
原来是咔咔 发表于 2022/03/27 00:55:08 2022/03/27
【摘要】 author:咔咔 WeChat:fangkangfk 什么是职责链模式: 职责链模式是包含了一些命令对象和一些处理对象,每个处理对象决定他能处理的那些命令对象,它也知道把自己不能处理的命令对象移交给下一个处理对象 白话解释: 这个案例一共三个职位,是经理,总监,总经理,职位就类似命令对象,请假这件事就类似命令对象,当经...

author:咔咔

WeChat:fangkangfk

什么是职责链模式:

职责链模式是包含了一些命令对象和一些处理对象,每个处理对象决定他能处理的那些命令对象,它也知道把自己不能处理的命令对象移交给下一个处理对象

白话解释:
这个案例一共三个职位,是经理,总监,总经理,职位就类似命令对象,请假这件事就类似命令对象,当经理处理不了的事情就需要移交给总监,总监处理的不了的事情就需要移交给总经理,这也就是我们的职责链模式

下来我们分段来解释这个案例

首先这个案例分为三部分第一部分是声明的属性,第二部分是抽象类里边设置上下级关系,抽象方法,第三部分就是业务方面的代码

在抽象类manage这个类中apply抽象方法中注入了request这个类

当请假数量大于2的时候经理的职权就不够了,这个时候就会走apply这个方法,this->manage这个属性是获取的对应职位的上级的类,然后在调用自己的处理函数方法完成逻辑处理,如还没有权限则继续追寻上级,直到权限满足返回处理结果即可


      <?php
      /**
       * Created by PhpStorm.
       * User: Administrator
       * Date: 2018/11/26
       * Time: 14:04
       */
      //申请Model
      class Request
      {
         //数量
         public $num;
         //申请类型
         public $requestType;
         //申请内容
         public $requestContent;
      }
      //抽象管理者
      abstract class Manager
      {
         protected $name;
         //管理者上级
         protected $manager;
         public function __construct($_name)
          {
             $this->name = $_name;
          }
         //设置管理者上级
         public function SetHeader(Manager $_mana)
          {
             $this->manager = $_mana;
          }
         //申请请求
         abstract public function Apply(Request $_req);
      }
      //经理
      class CommonManager extends Manager
      {
         public function __construct($_name)
          {
             parent::__construct($_name);
          }
         public function Apply(Request $_req)
          {
             if($_req->requestType=="请假" && $_req->num<=2)
              {
                 echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
              }
             else
              {
                 if(isset($this->manager))
                  {
                     $this->manager->Apply($_req);
                  }
              }
          }
      }
      //总监
      class MajorDomo extends Manager
      {
         public function __construct($_name)
          {
             parent::__construct($_name);
          }
         public function Apply(Request $_req)
          {
             if ($_req->requestType == "请假" && $_req->num <= 5)
              {
                 echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
              }
             else
              {
                 if (isset($this->manager))
                  {
                     $this->manager->Apply($_req);
                  }
              }
          }
      }
      //总经理
      class GeneralManager extends Manager
      {
         public function __construct($_name)
          {
             parent::__construct($_name);
          }
         public function Apply(Request $_req)
          {
             if ($_req->requestType == "请假")
              {
                 echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
              }
             else if($_req->requestType=="加薪" && $_req->num <= 500)
              {
                 echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
              }
             else if($_req->requestType=="加薪" && $_req->num>500)
              {
                 echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}再说吧。<br/>";
              }
          }
      }
      header("Content-Type:text/html;charset=utf-8");
      //--------------------职责链模式----------------------
      $jingli = new CommonManager("李经理");
      $zongjian = new MajorDomo("郭总监");
      $zongjingli = new GeneralManager("孙总");
      //设置直接上级
      $jingli->SetHeader($zongjian);
      $zongjian->SetHeader($zongjingli);
      //申请
      $req1 = new Request();
      $req1->requestType = "请假";
      $req1->requestContent = "小菜请假!";
      $req1->num = 20;
      $jingli->Apply($req1);
  
 

文章来源: blog.csdn.net,作者:咔咔-,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/fangkang7/article/details/84541431

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。