设计模式之备忘录模式–代码也有后悔药
备忘录模式
就是做个备份,可以实现撤销,游戏存档这样的功能。
在不破坏封装性前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将这个对象恢复到原先保存的状态。
为什么要使用备忘录模式
备忘录模式也是一个很少用到的模式,毕竟现在很多都有备份功能了。只有当你需要回到之前状态的时候才需要备忘录模式。
比如撤销功能,比如回退功能,比如游戏存档,说白了就是备份效果。只不过自带了备份效果。
php实现备忘录模式
既然是备忘录模式,那么应该有你要备份什么,备份的实体,也就是被备份的类。除了被备份的类,还有用来保存这个备份的备份类,也就是快照类。除了这两个类还需要一个用来保存快照的类,不然你的快照放在哪里呢?一般快照放在磁盘,我们这个就只能找个类存放了。也就是下面三个类:
- 需要备份的东西,被备份类,数据类。
- 拿什么来备份,快照类
- 备份放在哪里,磁盘类
首先,实现被备份的类
。
/**
* 备忘录模式
* 备忘录的实体数据,要备份的数据类
*/
class main {
//数据
public $text;
/**
* 进行备份操作
*/
function backup() {
new memento($this->text);
}
/**
* 使用备份进行恢复
* @param memento $memento 备份实例
*/
function renew(memento $memento) {
$this->text = $memento->getText();
}
/**
* 展示数据
*/
function show() {
dump($this->text);
}
}
有了要备份的东西,现在实现一个快照类
用来进行备份。
/**
* 备忘录模式
* 备忘录的备份类,快照类
*/
class memento {
//数据
private $text;
/**
* 进行备份操作
*/
function __construct($text) {
$this->text = $text;
}
/**
* 获取备份数据
*/
function getText() {
return $this->text;
}
}
现在都好了,但是呢,我们的备份存在哪里呢???一般的备份存在磁盘,我们同样要有个存储备份的地方啊,要实现一个备份存储类
/**
* 备忘录模式
* 备忘录的备份存储类,磁盘类
*/
class caretaker {
//存储备份实例
private $arr = [];
/**
* 进行备份操作
*/
function add(memento $memento) {
array_push($this->arr,$memento);
}
/**
* 把最新的一次备份返回
*/
function getMemento() {
return array_pop($this->arr);
}
}
备忘录模式只要记住三点就行
- 备份什么
- 用什么备份
- 备份的快照放在哪
代码放在了我的github上面。