-
Notifications
You must be signed in to change notification settings - Fork 0
/
memento.php
executable file
·109 lines (90 loc) · 2.53 KB
/
memento.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
/**
* Memento — это поведенческий паттерн проектирования, который позволяет сохранять и восстанавливать прошлые состояния
* объектов, не раскрывая подробностей их реализации.
*
* https://refactoring.guru/ru/design-patterns/memento
*
* Написать программу, используя паттерн Memento:
*
* Текстовый редактор
* Есть функции:
* - Сохранять новую версию документа
* - Возвращать определенную версию документа
*
* Решение на 96-й строке
*/
class Editor
{
// fields
private string $text;
private int $curX;
private int $curY;
public function setText(string $text): void
{
$this->text = $text;
}
public function setCurXY(int $curX, int $curY): void
{
$this->curX = $curX;
$this->curY = $curY;
}
public function createSnapshot(): Snapshot
{
return new Snapshot($this, $this->text, $this->curX, $this->curY);
}
}
interface Memento
{
public function restore();
}
class Snapshot implements Memento
{
private Editor $editor;
// fields
private string $text;
private int $curX;
private int $curY;
public function __construct(Editor $editor, string $text, int $curX, int $curY)
{
$this->editor = $editor;
$this->text = $text;
$this->curX = $curX;
$this->curY = $curY;
}
public function restore(): Editor
{
$this->editor->setText($this->text);
$this->editor->setCurXY($this->curX, $this->curY);
return $this->editor;
}
}
class Command
{
private Snapshot $backup;
public function __construct(public Editor $editor)
{
}
public function createBackup()
{
$this->backup = $this->editor->createSnapshot();
}
public function undo()
{
if (!is_null($this->backup)) {
$this->backup->restore();
}
}
}
# Client code
$editor = new Editor;
$editor->setText("Text1");
$editor->setCurXY(1, 11);
print_r($editor); // print editor with: text = Text1, curX=1, curY=11
$command = new Command($editor);
$command->createBackup();
$editor->setText("Text2");
$editor->setCurXY(2, 22);
print_r($editor); // print editor with: text = Text2, curX=2, curY=22
$command->undo();
print_r($editor); // print editor with: text = Text1, curX=1, curY=11