8000 complete chapter 24 · webphper/design-patterns-by-php@43526de · GitHub
[go: up one dir, main page]

Skip to content

Commit 43526de

Browse files
committed
complete chapter 24
1 parent 3cfed41 commit 43526de

File tree

2 files changed

+128
-10
lines changed

2 files changed

+128
-10
lines changed

chapter24.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
### 第二十四章 加薪非要老总批 --- 职责链模式
2+
```php
3+
abstract class Handler
4+
{
5+
protected $successor;
6+
7+
//设置继承者
8+
public function setSuccessor(Handler $successor)
9+
{
10+
$this->successor = $successor;
11+
}
12+
13+
//处理请求的抽象方法
14+
abstract function handleRequest(int $request);
15+
}
16+
17+
//如果可以处理请求,就处理之,否者转发给它的后继者
18+
class ConcreteHandler1 extends Handler
19+
{
20+
public function handleRequest(int $request)
21+
{
22+
if ($request >=0 && $request < 10)
23+
{
24+
echo "ConcreteHandler1 handle it\n";
25+
} else if ($this->successor != null) {
26+
// 转移
27+
$this->successor->handleRequest($request);
28+
}
29+
}
30+
}
31+
32+
class ConcreteHandler2 extends Handler
33+
{
34+
public function handleRequest(int $request)
35+
{
36+
if ($request >=10 && $request < 20)
37+
{
38+
echo "ConcreteHandler2 handle it\n";
39+
} else if ($this->successor != null) {
40+
$this->successor->handleRequest($request);
41+
}
42+
}
43+
}
44+
45+
// client
46+
$h1 = new ConcreteHandler1();
47+
$h2 = new ConcreteHandler2();
48+
设置职责链上下家
49+
$h1->setSuccessor($h2);
50+
$requests = [1,5,7,16,25];
51+
循环给最小处理者提交请求,不同的数额,由不同权限处理者处理
52+
foreach ($requests as $value) {
53+
$h1->handleRequest($value);
54+
}
55+
```
56+
57+
总结
58+
> ***职责链模式***, 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对像处理它为止。
59+
60+
> 当用户提交一个请求时,请求是沿着链传递直至有一个对象负责处理它。
61+
62+
> 接受者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需要保持一个向其后继者的引用,而不需要保持它所有的候选者的引用。
63+
64+
> 随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。
65+
66+
> 一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。
67+
68+
上一章:[第二十三章 烤羊肉串引来的思考 --- 命令模式](https://github.com/flyingalex/design-patterns-by-php/blob/master/chapter23.md)
69+
70+
下一章:[第二十五章 ](https://github.com/flyingalex/design-patterns-by-php/blob/master/chapter25.md)

codes/ChainOfResponsibility.php

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
// abstract class Handler
44
// {
55
// protected $successor;
6-
6+
7+
// 设置继承者
78
// public function setSuccessor(Handler $successor)
89
// {
910
// $this->successor = $successor;
1011
// }
11-
12+
// 处理请求的抽象方法
1213
// abstract function handleRequest(int $request);
1314
// }
14-
15+
16+
// 如果可以处理请求,就处理之,否者转发给它的后继者
1517
// class ConcreteHandler1 extends Handler
1618
// {
1719
// public function handleRequest(int $request)
@@ -20,6 +22,7 @@
2022
// {
2123
// echo "ConcreteHandler1 handle it\n";
2224
// } else if ($this->successor != null) {
25+
// // 转移
2326
// $this->successor->handleRequest($request);
2427
// }
2528
// }
@@ -41,8 +44,10 @@
4144
// // client
4245
// $h1 = new ConcreteHandler1();
4346
// $h2 = new ConcreteHandler2();
47+
// 设置职责链上下家
4448
// $h1->setSuccessor($h2);
4549
// $requests = [1,5,7,16,25];
50+
// 循环给最小处理者提交请求,不同的数额,由不同权限处理者处理
4651
// foreach ($requests as $value) {
4752
// $h1->handleRequest($value);
4853
// }
@@ -107,12 +112,12 @@ class CommonManager extends Manager
107112
{
108113
public function requestApplications(Request $request)
109114
{
110-
if ($request->requestType === 'dayoff' && $request->number <=2)
115+
if ($request->getRequestType() === 'dayoff' && $request->getNumber() <=2)
111116
{
112117
echo $this->name.":".$request->getRequestContent()." times:".$request->getNumber()."\n";
113118
} else {
114119
if ($this->superior != null) {
115-
$superior->requestApplications($request);
120+
$this->superior->requestApplications($request);
116121
}
117122
}
118123
}
@@ -122,12 +127,12 @@ class MajaorManager extends Manager
122127
{
123128
public function requestApplications(Request $request)
124129
{
125-
if ($request->requestType === 'dayoff' && $request->number <=5)
130+
if ($request->getRequestType() === 'dayoff' && $request->getNumber() <=5)
126131
{
127132
echo $this->name.":".$request->getRequestContent()." times:".$request->getNumber()."\n";
128133
} else {
129134
if ($this->superior != null) {
130-
$superior->requestApplications($request);
135+
$this->superior->requestApplications($request);
131136
}
132137
}
133138
}
@@ -137,13 +142,56 @@ class GeneralManager extends Manager
137142
{
138143
public function requestApplications(Request $request)
139144
{
140-
if ($request->requestType === 'dayoff')
145+
if ($request->getRequestType() === 'dayoff')
141146
{
142147
echo $this->name.":".$request->getRequestContent()." times:".$request->getNumber()."\n";
143-
} else if ($request->requestType === 'salary' && $request->number <= 500){
148+
} else if ($request->getRequestType() === 'salary' && $request->getNumber() <= 500){
144149
echo $this->name.":".$request->getRequestContent()." money:".$request->getNumber()."\n";
145150
} else {
146151
echo "no way!\n";
147152
}
148153
}
149-
}
154+
}
155+
156+
$jinli = new CommonManager('jinli');
157+
$zongjian = new MajaorManager('zongjian');
158+
$zhongjinli = new GeneralManager('zhongjinli');
159+
160+
$jinli->setSuperior($zongjian);
161+
$zongjian->setSuperior($zhongjinli);
162+
163+
$request = new Request();
164+
$request->setRequestType('dayoff');
165+
$request->setRequestContent('xiaocai dayoff');
166+
$request->setNumber(1);
167+
$jinli->requestApplications($request);
168+
169+
$request2 = new Request();
170+
$request2->setRequestType('dayoff');
171+
$request2->setRequestContent('xiaocai dayoff');
172+
$request2->setNumber(4);
173+
$jinli->requestApplications($request2);
174+
175+
$request3 = new Request();
176+
$request3->setRequestType('salary');
177+
$request3->setRequestContent('xiaocai add salary');
178+
$request3->setNumber(500);
179+
$jinli->requestApplications($request3);
180+
181+
$request4 = new Request();
182+
$request4->setRequestType('salary');
183+
$request4->setRequestContent('xiaocai add salary');
184+
$request4->setNumber(10000);
185+
$jinli->requestApplications($request4);
186+
187+
188+
189+
190+
191+
192+
193+
194+
195+
196+
197+

0 commit comments

Comments
 (0)
0