8000 Merge branch 'master' of github.com:flyingalex/design-patterns-by-php · sockstack/design-patterns-by-php@d895adb · GitHub
[go: up one dir, main page]

Skip to content

Commit d895adb

Browse files
author
Hu Lin
committed
Merge branch 'master' of github.com:flyingalex/design-patterns-by-php
2 parents 842bc4f + 43526de commit d895adb

File tree

5 files changed

+346
-11
lines changed

5 files changed

+346
-11
lines changed

chapter23.md

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,109 @@
11
### 第二十三章 烤羊肉串引来的思考 --- 命令模式
22

3+
```php
4+
<?php
5+
6+
//烤串
7+
8+
class Barbecuer
9+
{
10+
public function bakeMutton()
11+
{
12+
echo "烤羊肉串\n";
13+
}
14+
15+
public function bakeChickenWing()
16+
{
17+
echo "烤鸡翅\n";
18+
}
19+
}
20+
21+
// 抽象命令
22+
abstract class Command
23+
{
24+
protected $receiver;
25+
26+
function __construct(Barbecuer $receiver)
27+
{
28+
$this->receiver = $receiver;
29+
}
30+
31+
abstract public function excuteCommand();
32+
}
33+
34+
//烤羊肉
35+
class BakeMuttonCommand extends Command
36+
{
37+
public function excuteCommand()
38+
{
39+
$this->receiver->bakeMutton();
40+
}
41+
}
42+
43+
//烤鸡翅
44+
class BakeChickenWingCommand extends Command
45+
{
46+
public function excuteCommand()
47+
{
48+
$this->receiver->bakeChickenWing();
49+
}
50+
}
51+
52+
//服务员
53+
class Waiter
54+
{
55+
private $commands = [];
56+
57+
//设置订单
58+
public function setOrder(Command $command)
59+
{
60+
if ($command instanceof BakeChickenWingCommand)
61+
{
62+
echo "服务员: 鸡翅没有了,请点别的烧烤\n";
63+
} else {
64+
echo "增加订单\n";
65+
array_push($this->commands, $command);
66+
}
67+
}
68+
69+
//取消订单
70+
public function cancelOrder(Command $command){}
71+
72+
//通知执行
73+
public function notify()
74+
{
75+
foreach ($this->commands as $value) {
76+
$value->excuteCommand();
77+
}
78+
}
79+
}
80+
81+
//客户端代码
82+
83+
//开店前准备
84+
$boy = new Barbecuer();
85+
$bakeMuttonCommand1 = new BakeMuttonCommand($boy);
86+
$bakeMuttonCommand2 = new BakeMuttonCommand($boy);
87+
$bakeChickenWingCommand1 = new BakeChickenWingCommand($boy);
88+
$girl = new Waiter();
89+
90+
//开门营业
91+
$girl->setOrder($bakeMuttonCommand1);
92+
$girl->setOrder($bakeMuttonCommand2);
93+
$girl->setOrder($bakeChickenWingCommand1);
94+
$girl->notify();
95+
```
96+
397
总结:
498

99+
> ***命令模式***,将 一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
100+
101+
> 对请求派对或记录请求日志,以及日志可撤销的操作。
102+
103+
> 优点:第一,能较容易地设计一个命令队列;第二,在需要的情况下,可以较容易地将命令记入日志;第三,允许请求的一方决定是否要否决请求;第四,可以容易地实现对请求的撤销和重做;第五,由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易;最重要的是该 模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开。
104+
105+
> 敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般酒不要急着去实现它,事实上,在需要的时候通过重构实现这个模式并不难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。
5106
6107
上一章:[第二十二章 手机软件何时统一 --- 桥接模式](https://github.com/flyingalex/design-patterns-by-php/blob/master/chapter22.md)
7108

8-
下一章:[第二十四章 ](https://github.com/flyingalex/design-patterns-by-php/blob/master/chapter24.md)
109+
下一章:[第二十四章 加薪非要老总批 --- 职责链模式](https://github.com/flyingalex/design-patterns-by-php/blob/master/chapter24.md)

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)

chpter24.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
### 第二十四章 加薪非要老总批 --- 职责链模式
2+
3+
总结:
4+
5+
6+
上一章:[第二十三章 烤羊肉串引来的思考 --- 命令模式](https://github.com/flyingalex/design-patterns-by-php/blob/master/chapter23.md)
7+
8+
下一章:[第二十五章 ](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- F438
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