职责链模式:避免请求发送者和请求接收者的耦合关系。将接受者连成一条链,直到有接收者处理请求。 例如,假设你要请假,请假3天以内部门领导可以批准,7天以内需要部门领导和总监批准,7天以上需要部门领导、总监和董事长批准。 你只需向部门领导,部门领导如果察觉超出权限,自动向上级报告并交由上级处理。 职责链模式使客户传递请求后,层层递进,直到有人去处理请求。职责链模式适用于请求接收动态变化、多个对象可能会根据请求不同分别进行处理的情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 <?php class Request { /** * @var string */ public $requester; /** * @var int */ public $dayCount; /** * @var string */ public $reason; /** * Request constructor. * @param $requester string * @param $dayCount int * @param $reason string */ public function __construct($requester, $dayCount, $reason) { $this->requester = $requester; $this->dayCount = $dayCount; $this->reason = $reason; } } interface Manager { /** * @param Request $request * @return mixed */ public function handle(Request $request); } class DepartmentManager implements Manager { /** * @var Manager */ private $supervisor; /** * @var string */ private $name; public function __construct($name) { $this->name = $name; } public function handle(Request $request) { if ($request->dayCount > 3) { $this->supervisor->handle($request); } else { echo $this->name . "批准了" . $request->requester . "的请假, 共" . $request->dayCount . "天"; echo "\r\n原因是:" . $request->reason; } } public function setSupervisor(Manager $manager) { $this->supervisor = $manager; } } class CompanyManager implements Manager { /** * @var Manager */ private $supervisor; /** * @var string */ private $name; public function __construct($name) { $this->name = $name; } public function handle(Request $request) { if ($request->dayCount > 7) { $this->supervisor->handle($request); } else { echo $this->name . "批准了" . $request->requester . "的请假, 共" . $request->dayCount . "天"; echo "\r\n原因是:" . $request->reason; } } public function setSupervisor(Manager $manager) { $this->supervisor = $manager; } } class SuperManager implements Manager { /** * @var Manager */ private $supervisor; /** * @var string */ private $name; public function __construct($name) { $this->name = $name; } public function handle(Request $request) { echo $this->name . "批准了" . $request->requester . "的请假, 共" . $request->dayCount . "天"; echo "\r\n原因是:" . $request->reason; } public function setSupervisor(Manager $manager) { $this->supervisor = $manager; } } $departmentManager = new DepartmentManager("部门领导"); $companyManager = new CompanyManager("公司领导"); $superManager = new SuperManager("董事长"); $departmentManager->setSupervisor($companyManager); $companyManager->setSupervisor($superManager); $request = new Request("小明", 3, "我想回家回家回家"); $departmentManager->handle($request);