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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159


class Memento
{
/**
* 备忘录列表
*
* @var array
*/
private $_mementoList = [];

/**
* 添加编辑器实例状态
*
* @param Editor $editor 编辑器实例
*/
function add(Editor $editor)
{
array_push($this->_mementoList, $editor);
}

/**
* 返回编辑器实例上个状态
*
* @param Editor $editor 编辑器实例
*/
function undo()
{
return array_pop($this->_mementoList);
}

/**
* 返回编辑器实例开始状态
*
* @param Editor $editor 编辑器实例
*/
function redo()
{
return array_shift($this->_mementoList);
}
}


class Editor
{
/**
* 编辑器内容
* @var string
*/
private $_content = '';

/**
* 备忘录实例
* @var Memento
*/
private $_memento;

/**
* 构造函数
*
* @param string $content 打开的文件内容
*/
function __construct($content='')
{
$this->_content = $content;
// 打印初始内容
$this->read();

// 初始化备忘录插件
$this->_memento = new Memento();
// 第一次打开编辑器自动保存一次以提供重置状态操作
$this->save($content);
}

/**
* 写入内容
*
* @param string $value 文本
* @return boolean
*/
function write($value='')
{
$this->_content .= $value;
$this->read();
}

/**
* 读取当前内容
*
* @param string $value 文本
* @return boolean
*/
function read()
{
echo $this->_content? $this->_content . "\n": "空文本" . "\n";
}


/**
* 保存内容
*
* @return boolean
*/
function save()
{
$this->_memento->add(clone $this);
}

/**s
* 后退
*
* @return boolean
*/
function undo()
{
// 获取上个状态
$undo = $this->_memento->undo();
// 重置当前状态为上个状态
$this->_content = $undo->_content;
}

/**
* 复原
*
* @return boolean
*/
function redo()
{
// 获取开始状态
$undo = $this->_memento->redo();
// 重置当前状态为开始状态
$this->_content = $undo->_content;
}
}


try {
// 初始化一个编辑器并新建一个空文件
$editor = new Editor('');

// 写入一段文本
$editor->write('hello php !');
// 保存
$editor->save();
// 修改刚才的文本
$editor->write(' no code no life !');
// 撤销
$editor->undo();
$editor->read();
// 再次修改并保存文本
$editor->write(' life is a struggle !');
$editor->save();
// 重置
$editor->redo();
$editor->read();

} catch (\Exception $e) {
echo 'error:' . $e->getMessage();
}