若转载教程,请注明出自SW-X框架官方文档1

    1. <?php
    2. /**
    3. * 设计模式之责任链模式
    4. * 使用场景:
    5. * 1、当不确定该使用某个处理对象时,可动态指定一组对象来进行业务处理。
    6. * 2、当需要进行任务层级递交处理时,可以进行上级关联,进行业务递交申请。
    7. * 小黄牛
    8. */
    9. header("Content-type: text/html; charset=utf-8");
    10. /**
    11. * 抽象出 处理者 类
    12. */
    13. abstract class Manager{
    14. protected $name; // 处理者名称
    15. protected $manager; // 上级处理者的实例
    16. # 设置上级处理者名称
    17. public function __construct($_name){
    18. $this->name = $_name;
    19. }
    20. # 设置上级处理者
    21. public function SetHeader($_new){
    22. $this->manager = $_new;
    23. }
    24. /**
    25. * 处理业务申请
    26. * $RegNew 是一个业务申请内容的实例
    27. */
    28. abstract public function Apply($RegNew);
    29. }
    30. /**
    31. * 创建一个 CEO处理者
    32. */
    33. class Ceo extends Manager{
    34. # 调用父类构造函数,申明处理者名称
    35. public function __construct($_name){
    36. parent::__construct($_name);
    37. }
    38. # 处理业务申请内容
    39. public function Apply($RegNew){
    40. # 处理申请
    41. if ($RegNew->requestType == "请假" && $RegNew->num >= 2) {
    42. echo "{$this->name} : 请假时间 {$RegNew->num} 天,已超过公司制度,不允批准。<br/>";
    43. return true;
    44. }
    45. # 判定是否存在上级处理者,是则向上级提交
    46. if (isset($this->manager)) {
    47. $this->manager->Apply($RegNew);
    48. }
    49. }
    50. }
    51. /**
    52. * 创建一个 人事处理者
    53. */
    54. class Personnel extends Manager{
    55. # 调用父类构造函数,申明处理者名称
    56. public function __construct($_name){
    57. parent::__construct($_name);
    58. }
    59. # 处理业务申请内容
    60. public function Apply($RegNew){
    61. # 处理申请
    62. if ($RegNew->requestType == "请假" && $RegNew->num >= 2) {
    63. echo "{$this->name} : 请假时间 {$RegNew->num} 天,超过公司制度,但事发突然,建议可允批准。<br/>";
    64. }
    65. # 判定是否存在上级处理者,是则向上级提交
    66. if (isset($this->manager)) {
    67. $this->manager->Apply($RegNew);
    68. }
    69. }
    70. }
    71. /**
    72. * 模拟一个 业务实例
    73. */
    74. class Request{
    75. public $num; // 请假天数
    76. public $requestType; // 业务类型
    77. }
    78. # 实例化所有处理者
    79. $Boss = new Ceo("张总");
    80. $Rens = new Personnel("人事经理");
    81. # 设置上级处理者, CEO在业务总是顶级, 而人事经理的上级则是直属与CEO,所以我们只需要设置一下人事经理的上级处理者即可
    82. $Rens->SetHeader($Boss);
    83. # 向人事部递交一份申请
    84. $res = new Request();
    85. $res->requestType = "请假";
    86. $res->num = 2;
    87. $Rens->Apply($res);

    浏览器输出

    1. 人事经理 : 请假时间 2 天,超过公司制度,但事发突然,建议可允批准。
    2. 张总 : 请假时间 2 天,已超过公司制度,不允批准。

    责任链模式

    1. 抽象处理者(Manager):定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
    2. 具体处理者(CommonManager):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

    应用场景

    1. 1、当不确定该使用某个处理对象时,可动态指定一组对象来进行业务处理。
    2. 2、当需要进行任务层级递交处理时,可以进行上级关联,进行业务递交申请。