职责链模式

职责链模式

1.将请求的发送者和请求的处理者解耦了。责任链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递。
2.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任

抽象类(bastract)和接口(interface)的区别 地址:https://blog.df5g.com/article/28

代码

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: dream
  5. * Date: 2018/10/13
  6. * Time: 下午10:20
  7. * 职责链模式(责任链)
  8. * 各种优惠券活动,订单结算,申请审批等需要区分角色权限的都可运用
  9. * 下面代码,经过简单的封装已将客户请求层,与业务处理层都实现模块化,功能单一化,降低耦合度.
  10. */
  11. // 定义一个处理请示的接口
  12. abstract class Handler
  13. {
  14. /**
  15. * 存放下一个处理对象
  16. * @var
  17. */
  18. private $next_handler;
  19. /**
  20. * 处理级别默认为0
  21. * @var int
  22. */
  23. private $lever = 0;
  24. /**
  25. * 处理者回应方法
  26. * @return mixed
  27. */
  28. abstract protected function response();
  29. /**
  30. * 设置下一个处理级别
  31. * @param $lever
  32. */
  33. public function setHandlerLevel($lever)
  34. {
  35. $this->lever = $lever;
  36. }
  37. /**
  38. * 设置下一个处理者是谁
  39. * @param Handler $handler
  40. */
  41. public function setNext(Handler $handler)
  42. {
  43. $this->next_handler = $handler;
  44. $this->next_handler->setHandlerLevel($this->lever + 1);
  45. }
  46. /**
  47. * 职责链主要实现方法,判断责任是否属于该对象,不属于则转发给下一级.使用final 修饰不允许重写
  48. * @param Request $request
  49. */
  50. final public function handlerMessage(Request $request)
  51. {
  52. if ($this->lever == $request->getLever()) {
  53. $this->response();
  54. } else {
  55. if ($this->next_handler != null) {
  56. $this->next_handler->handlerMessage($request);
  57. } else {
  58. echo "没有人帮你处理!" . PHP_EOL;
  59. }
  60. }
  61. }
  62. }
  63. # 处理对象
  64. /**
  65. * 主管
  66. * Class Director
  67. */
  68. class Director extends Handler
  69. {
  70. protected function response()
  71. {
  72. echo "主管回复你: 同意你的请求!" . PHP_EOL;
  73. }
  74. }
  75. /**
  76. * 经理
  77. * Class Manager
  78. */
  79. class Manager extends Handler
  80. {
  81. protected function response()
  82. {
  83. echo "经理回复你: 知道了,允许你的请求!" . PHP_EOL;
  84. }
  85. }
  86. /**
  87. * 老板
  88. * Class Boos
  89. */
  90. class Boos extends Handler
  91. {
  92. protected function response()
  93. {
  94. echo "老板回复你: 过两天再议!" . PHP_EOL;
  95. }
  96. }
  97. /**
  98. * 单例封装审批层
  99. * Class DutyInit
  100. */
  101. class DutyInit
  102. {
  103. //私有化静态调用对象
  104. private static $duty = null;
  105. //存储主管实例
  106. private static $director = null;
  107. private static $manager = null;
  108. private static $boss = null;
  109. //私有实例化方法
  110. private function __construct()
  111. {
  112. //实例化主管
  113. self::$director = new Director();
  114. //实例化经理
  115. self::$manager = new Manager();
  116. //实例化老板
  117. self::$boss = new Boos();
  118. //责任链关系组装绑定
  119. self::$director->setNext(self::$manager); //主管的上级领导为经理
  120. self::$manager->setNext(self::$boss); //经理的上级领导为老板
  121. }
  122. //单例审批公共入口
  123. public static function handlerMessage(Request $request)
  124. {
  125. empty(self::$duty) && self::$duty = new self();
  126. //默认为主管审批,等级不够则进行层次审批
  127. self::$director->handlerMessage($request);
  128. }
  129. //私有克隆方法
  130. private function __clone()
  131. {
  132. die("禁止克隆" . E_USER_ERROR);
  133. }
  134. }
  135. /**
  136. * 用户请求类
  137. * Class Request
  138. */
  139. class Request
  140. {
  141. //定义等级类型
  142. protected $level = ['请假' => 0, '休假' => 1, '加班' => 2, '辞职' => 3];
  143. protected $request;
  144. public function __construct($request)
  145. {
  146. $this->request = $request;
  147. }
  148. public function getLever()
  149. {
  150. //获取请求对应的级别,如果改请求动作没有对应级别处理 则返回-1
  151. return array_key_exists($this->request, $this->level) ? $this->level[$this->request] : -1;
  152. }
  153. }
  154. //测试
  155. echo "<pre>";
  156. DutyInit::handlerMessage(new Request('请假'));
  157. DutyInit::handlerMessage(new Request('休假'));
  158. DutyInit::handlerMessage(new Request('加班'));
  159. DutyInit::handlerMessage(new Request('辞职'));
  160. //测试结果
  161. // 主管回复你: 同意你的请求!
  162. // 经理回复你: 知道了,允许你的请求!
  163. // 老板回复你: 过两天再议!
  164. // 没有人帮你处理!


评论 0

发表评论

Top