-
Notifications
You must be signed in to change notification settings - Fork 0
/
state.php
executable file
·92 lines (79 loc) · 2.51 KB
/
state.php
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
<?php
/**
* State (Состояние) — это поведенческий паттерн проектирования, который позволяет объектам менять поведение в
* зависимости от своего состояния. Извне создаётся впечатление, что изменился класс объекта.
*
* https://refactoring.guru/ru/design-patterns/state
*
* Написать программу, используя паттерн State:
*
* Печь для приготовления пиццы
* Состояния:
* - Холодная
* - Готова к работе
* - Перегрев
* И методы перехода между состояниями
*
* А так же метод bake() который ведет себя по разному в зависимости от того, в каком состоянии печь - в не прогретом
* и в перегретом кидает эксепшены, а в нормальном - работает
*
* Решение на 79-й строке
*/
abstract class State
{
public Oven $oven;
public function __construct(Oven $oven)
{
$this->oven = $oven;
}
abstract public function bake();
}
class ColdState extends State
{
public function bake()
{
$this->oven->changeState($this);
throw new Exception('Печь слишком холодная :(');
}
}
class ReadyState extends State
{
public function bake()
{
$this->oven->changeState($this);
echo PHP_EOL . "Печь в подходящем состоянии для выпечкания! :)";
}
}
class HotState extends State
{
public function bake()
{
$this->oven->changeState($this);
throw new Exception('Печь слишком горячая :(');
}
}
class Oven
{
public State $state;
public function changeState(State $state)
{
$this->state = $state;
}
public function bake()
{
$this->state->bake();
}
}
# Client code
$oven = new Oven();
$state = new ColdState($oven);
$oven->changeState($state);
try {
$oven->bake();
} catch (Exception $e) {
echo $e->getMessage(); // выводит текст эксепшина ("Печь слишком холодная :(")
}
$state = new ReadyState($oven);
$oven->changeState($state);
$oven->bake(); // выводит текст ("Печь в подходящем состоянии для выпечкания! :)")
echo PHP_EOL;