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

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

author:咔咔

WeChat:fangkangfk

什么是职责链模式:

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

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

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

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

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

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


  
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2018/11/26
  6. * Time: 14:04
  7. */
  8. //申请Model
  9. class Request
  10. {
  11. //数量
  12. public $num;
  13. //申请类型
  14. public $requestType;
  15. //申请内容
  16. public $requestContent;
  17. }
  18. //抽象管理者
  19. abstract class Manager
  20. {
  21. protected $name;
  22. //管理者上级
  23. protected $manager;
  24. public function __construct($_name)
  25. {
  26. $this->name = $_name;
  27. }
  28. //设置管理者上级
  29. public function SetHeader(Manager $_mana)
  30. {
  31. $this->manager = $_mana;
  32. }
  33. //申请请求
  34. abstract public function Apply(Request $_req);
  35. }
  36. //经理
  37. class CommonManager extends Manager
  38. {
  39. public function __construct($_name)
  40. {
  41. parent::__construct($_name);
  42. }
  43. public function Apply(Request $_req)
  44. {
  45. if($_req->requestType=="请假" && $_req->num<=2)
  46. {
  47. echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
  48. }
  49. else
  50. {
  51. if(isset($this->manager))
  52. {
  53. $this->manager->Apply($_req);
  54. }
  55. }
  56. }
  57. }
  58. //总监
  59. class MajorDomo extends Manager
  60. {
  61. public function __construct($_name)
  62. {
  63. parent::__construct($_name);
  64. }
  65. public function Apply(Request $_req)
  66. {
  67. if ($_req->requestType == "请假" && $_req->num <= 5)
  68. {
  69. echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
  70. }
  71. else
  72. {
  73. if (isset($this->manager))
  74. {
  75. $this->manager->Apply($_req);
  76. }
  77. }
  78. }
  79. }
  80. //总经理
  81. class GeneralManager extends Manager
  82. {
  83. public function __construct($_name)
  84. {
  85. parent::__construct($_name);
  86. }
  87. public function Apply(Request $_req)
  88. {
  89. if ($_req->requestType == "请假")
  90. {
  91. echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
  92. }
  93. else if($_req->requestType=="加薪" && $_req->num <= 500)
  94. {
  95. echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。<br/>";
  96. }
  97. else if($_req->requestType=="加薪" && $_req->num>500)
  98. {
  99. echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}再说吧。<br/>";
  100. }
  101. }
  102. }
  103. header("Content-Type:text/html;charset=utf-8");
  104. //--------------------职责链模式----------------------
  105. $jingli = new CommonManager("李经理");
  106. $zongjian = new MajorDomo("郭总监");
  107. $zongjingli = new GeneralManager("孙总");
  108. //设置直接上级
  109. $jingli->SetHeader($zongjian);
  110. $zongjian->SetHeader($zongjingli);
  111. //申请
  112. $req1 = new Request();
  113. $req1->requestType = "请假";
  114. $req1->requestContent = "小菜请假!";
  115. $req1->num = 20;
  116. $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个月内不可修改。