forked from wenjy/design_patten_php
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Memento.php
129 lines (111 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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
/**
* 备忘录模式
*
* 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
* 这样以后就可以将该对象恢复都原先保存的状态。
*
* 备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性
* 只是众多属性中的一小部分时, Originator 可以根据保存的 Memento 信息还原到前一状态。
*
* 如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储
* 可撤销操作的状态。
*
* 当角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时储存起来的备忘录将状态复原
*
*/
/**
* 负责创建一个备忘录 Memento 用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态
*
* Class Originator
*/
class Originator
{
private $state;
/**
* @return mixed
*/
public function getState()
{
return $this->state;
}
/**
* @param mixed $state
*/
public function setState($state)
{
$this->state = $state;
}
public function createMemento()
{
return (new Memento($this->state));
}
public function setMemento(Memento $memento)
{
$this->state = $memento->getState();
}
public function show()
{
echo 'State:' . $this->state . PHP_EOL;
}
}
/**
* 负责存储 Originator 对象的内部状态,并可以防止 Originator 以外的其他对象访问备忘录 Memento
*
* Class Memento
*/
class Memento
{
private $state;
/**
* Memento constructor.
* @param $state
*/
public function __construct($state)
{
$this->state = $state;
}
/**
* @return mixed
*/
public function getState()
{
return $this->state;
}
}
/**
* 负责保存备忘录 Memento
*
* Class Caretaker
*/
class Caretaker
{
private $memento;
/**
* @return mixed
*/
public function getMemento()
{
return $this->memento;
}
/**
* @param mixed $memento
*/
public function setMemento($memento)
{
$this->memento = $memento;
}
}
// 初始状态
$o = new Originator();
$o->setState('on');
$o->show();
// 保存备忘录
$c = new Caretaker();
$c->setMemento($o->createMemento());
// 结束状态
$o->setState('off');
$o->show();
// 还原状态
$o->setMemento($c->getMemento());
$o->show();