0%

设计模式学习:职责链模式

职责链模式:避免请求发送者和请求接收者的耦合关系。将接受者连成一条链,直到有接收者处理请求。
例如,假设你要请假,请假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);