10000 complete chapter 16 · webphper/design-patterns-by-php@0e507c1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0e507c1

Browse files
committed
complete chapter 16
1 parent facefff commit 0e507c1

File tree

3 files changed

+385
-1
lines changed

3 files changed

+385
-1
lines changed

chapter16.md

Lines changed: 162 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,170 @@
11
### 第十六章 无尽加班何时休 --- 状态模式
22

3+
```php
4+
//工作状态
5+
abstract class State
6+
{
7+
abstract public function WriteProgram(Work $w);
8+
}
9+
10+
class ForenoonState extends State
11+
{
12+
public function WriteProgram(Work $w)
13+
{
14+
if ($w->getHour() < 12) {
15+
echo "当前时间:".$w->getHour()." 上午工作,精神百倍\n";
16+
} else {
17+
$w->setState(new NoonState());
18+
$w->WriteProgram();
19+
}
20+
}
21+
}
22+
23+
class NoonState extends State
24+
{
25+
public function WriteProgram(Work $w)
26+
{
27+
if ($w->getHour() < 13) {
28+
echo "当前时间:".$w->getHour()." 饿了,午饭;犯困,午休\n";
29+
} else {
30+
$w->setState(new AfterNoonState());
31+
$w->WriteProgram();
32+
}
33+
}
34+
}
35+
36+
class AfterNoonState extends State
37+
{
38+
public function WriteProgram(Work $w)
39+
{
40+
if ($w->getHour() < 17) {
41+
echo "当前时间:".$w->getHour()." 下午状态不错,继续努力\n";
42+
} else {
43+
$w->setState(new EveningState());
44+
$w->WriteProgram();
45+
}
46+
}
47+
}
48+
49+
class EveningState extends State
50+
{
51+
public function WriteProgram(Work $w)
52+
{
53+
if ($w->getTaskFinishedState()) {
54+
//如果完成任务,下班
55+
$w->setState(new RestState());
56+
$w->WriteProgram();
57+
} else {
58+
if ($w->getHour() < 21) {
59+
echo "当前时间:".$w->getHour()." 加班哦,疲惫之极\n";
60+
} else {
61+
//超过21点,则转入睡眠工作状态
62+
$w->setState(new SleepingState());
63+
$w->WriteProgram();
64+
}
65+
}
66+
}
67+
}
68+
69+
class SleepingState extends State
70+
{
71+
public function WriteProgram(Work $w)
72+
{
73+
echo "当前时间:".$w->getHour()." 不 57AE 行了,睡觉\n";
74+
}
75+
}
76+
77+
class RestState extends State
78+
{
79+
public function WriteProgram(Work $w)
80+
{
81+
echo "当前时间:".$w->getHour()." 下班回家\n";
82+
}
83+
}
84+
85+
class Work
86+
{
87+
private $current;
88+
89+
function __construct()
90+
{
91+
$this->current = new ForenoonState();
92+
}
93+
94+
private $hour;
95+
public function getHour()
96+
{
97+
return $this->hour;
98+
}
99+
public function setHour($hour)
100+
{
101+
$this->hour = $hour;
102+
}
103+
104+
private $finished = false;
105+
public function setTaskFinished($bool)
106+
{
107+
$this->finished = $bool;
108+
}
109+
public function getTaskFinishedState()
110+
{
111+
return $this->finished;
112+
}
113+
114+
public function setState(State $state)
115+
{
116+
$this->current = $state;
117+
}
118+
119+
public function WriteProgram()
120+
{
121+
$this->current->WriteProgram($this);
122+
}
123+
}
124+
125+
//客户端代码
126+
$emergencyProjects = new Work();
127+
$emergencyProjects->setHour(9);
128+
$emergencyProjects->WriteProgram();
129+
$emergencyProjects->setHour(10);
130+
$emergencyProjects->WriteProgram();
131+
$emergencyProjects->setHour(12);
132+
$emergencyProjects->WriteProgram();
133+
$emergencyProjects->setHour(13);
134+
$emergencyProjects->WriteProgram();
135+
$emergencyProjects->setHour(14);
136+
$emergencyProjects->WriteProgram();
137+
$emergencyProjects->setHour(17);
138+
139+
$emergencyProjects->setTaskFinished(false);
140+
$emergencyProjects->WriteProgram();
141+
142+
$emergencyProjects->setHour(19);
143+
$emergencyProjects->WriteProgram();
144+
$emergencyProjects->setHour(22);
145+
$emergencyProjects->WriteProgram();
146+
147+
```
148+
3149
总结:
4150

151+
> ***状态模式***,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
152+
153+
> 面向对象设计其实就是希望做到代码的责任分解。
154+
155+
> 状态模式主要解决的当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简单化。
156+
157+
> 将于特定状态相关的行为局部化,并且将不同状态的行为分割开来。
158+
159+
> 将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义的子类可以很容易地增加新的状态和转换。
160+
161+
> 消除了庞大的条件分支语句。
162+
163+
> 状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少项目之间的依赖。
164+
165+
> 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
5166
6167

7168
上一章:[第十五章 就不能不换DB吗? --- 抽象工厂模式](https://github.com/flyingalex/design-patterns-by-php/blob/master/chapter15.md)
8169

9-
下一章:[第十七章](https://github.com/flyingalex/design-patterns-by-php/blob/master/chapter17.md)
170+
下一章:[第十七章 在NBA我需要翻译 --- 适配器模式](https://github.com/flyingalex/design-patterns-by-php/blob/master/chapter17.md)

chapter17.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
### 第十七章 在NBA我需要翻译 --- 适配器模式
2+
3+
总结:
4+
5+
6+
7+
上一章:[第十六章 无尽加班何时休 --- 状态模式](https://github.com/flyingalex/design-patterns-by-php/blob/master/chapter16.md)
8+
9+
下一章:[第十八章](https://github.com/flyingalex/design-patterns-by-php/blob/master/chapter18.md)

codes/State.php

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
<?php
2+
3+
// class Context
4+
// {
5+
// private $state;
6+
7+
// function __construct(State $state)
8+
// {
9+
// $this->state = $state;
10+
// }
11+
12+
// public function setState(State $state)
13+
// {
14+
// $this->state = $state;
15+
// }
16+
17+
// public function getState(State $state)
18+
// {
19+
// return $this->state;
20+
// }
21+
22+
// public function request()
23+
// {
24+
// $this->state->Handle($this);
25+
// }
26+
// }
27+
28+
29+
// abstract class State
30+
// {
31+
// abstract public function Handle(Context $context);
32+
// }
33+
34+
// class ConcreteStateA extends State
35+
// {
36+
// public function Handle(Context $context)
37+
// {
38+
// echo "ConcreteStateA Handler\n";
39+
// $context->setState(new ConcreteStateB());
40+
// }
41+
// }
42+
43+
// class ConcreteStateB extends State
44+
// {
45+
// public function Handle(Context $context)
46+
// {
47+
// echo "ConcreteStateB Handler\n";
48+
// $context->setState(new ConcreteStateA());
49+
// }
50+
// }
51+
52+
53+
// //客户端代码
54+
// $context = new Context(new ConcreteStateA());
55+
// $context->request();
56+
// $context->request();
57+
// $context->request();
58+
// $context->request();
59+
60+
//工作状态
61+
abstract class State
62+
{
63+
abstract < 2851 span class=pl-k>public function WriteProgram(Work $w);
64+
}
65+
66+
class ForenoonState extends State
67+
{
68+
public function WriteProgram(Work $w)
69+
{
70+
if ($w->getHour() < 12) {
71+
echo "当前时间:".$w->getHour()." 上午工作,精神百倍\n";
72+
} else {
73+
$w->setState(new NoonState());
74+
$w->WriteProgram();
75+
}
76+
}
77+
}
78+
79+
class NoonState extends State
80+
{
81+
public function WriteProgram(Work $w)
82+
{
83+
if ($w->getHour() < 13) {
84+
echo "当前时间:".$w->getHour()." 饿了,午饭;犯困,午休\n";
85+
} else {
86+
$w->setState(new AfterNoonState());
87+
$w->WriteProgram();
88+
}
89+
}
90+
}
91+
92+
class AfterNoonState extends State
93+
{
94+
public function WriteProgram(Work $w)
95+
{
96+
if ($w->getHour() < 17) {
97+
echo "当前时间:".$w->getHour()." 下午状态不错,继续努力\n";
98+
} else {
99+
$w->setState(new EveningState());
100+
$w->WriteProgram();
101+
}
102+
}
103+
}
104+
105+
class EveningState extends State
106+
{
107+
public function WriteProgram(Work $w)
108+
{
109+
if ($w->getTaskFinishedState()) {
110+
//如果完成任务,下班
111+
$w->setState(new RestState());
112+
$w->WriteProgram();
113+
} else {
114+
if ($w->getHour() < 21) {
115+
echo "当前时间:".$w->getHour()." 加班哦,疲惫之极\n";
116+
} else {
117+
//超过21点,则转入睡眠工作状态
118+
$w->setState(new SleepingState());
119+
$w->WriteProgram();
120+
}
121+
}
122+
}
123+
}
124+
125+
class SleepingState extends State
126+
{
127+
public function WriteProgram(Work $w)
128+
{
129+
echo "当前时间:".$w->getHour()." 不行了,睡觉\n";
130+
}
131+
}
132+
133+
class RestState extends State
134+
{
135+
public function WriteProgram(Work $w)
136+
{
137+
echo "当前时间:".$w->getHour()." 下班回家\n";
138+
}
139+
}
140+
141+
class Work
142+
{
143+
private $current;
144+
145+
function __construct()
146+
{
147+
$this->current = new ForenoonState();
148+
}
149+
150+
private $hour;
151+
public function getHour()
152+
{
153+
return $this->hour;
154+
}
155+
public function setHour($hour)
156+
{
157+
$this->hour = $hour;
158+
}
159+
160+
private $finished = false;
161+
public function setTaskFinished($bool)
162+
{
163+
$this->finished = $bool;
164+
}
165+
public function getTaskFinishedState()
166+
{
167+
return $this->finished;
168+
}
169+
170+
public function setState(State $state)
171+
{
172+
$this->current = $state;
173+
}
174+
175+
public function WriteProgram()
176+
{
177+
$this->current->WriteProgram($this);
178+
}
179+
}
180+
181+
//客户端代码
182+
$emergencyProjects = new Work();
183+
$emergencyProjects->setHour(9);
184+
$emergencyProjects->WriteProgram();
185+
$emergencyProjects->setHour(10);
186+
$emergencyProjects->WriteProgram();
187+
$emergencyProjects->setHour(12);
188+
$emergencyProjects->WriteProgram();
189+
$emergencyProjects->setHour(13);
190+
$emergencyProjects->WriteProgram();
191+
$emergencyProjects->setHour(14);
192+
$emergencyProjects->WriteProgram();
193+
$emergencyProjects->setHour(17);
194+
195+
$emergencyProjects->setTaskFinished(false);
196+
$emergencyProjects->WriteProgram();
197+
198+
$emergencyProjects->setHour(19);
199+
$emergencyProjects->WriteProgram();
200+
$emergencyProjects->setHour(22);
201+
$emergencyProjects->WriteProgram();
202+
203+
204+
205+
206+
207+
208+
209+
210+
211+
212+
213+
214+

0 commit comments

Comments
 (0)
0