概述
备忘录模式是一种行为型设计模式,它允许你捕获对象的内部状态并在需要时恢复它。通过将对象状态封装在备忘录对象中,备忘录模式可以在不破坏对象封装性的情况下实现状态的保存和恢复。
适用场景
备忘录模式适用于以下情况:
- 当你需要保存和恢复对象的内部状态时,以便在后续时间点重新使用该状态。
- 当直接访问对象的内部状态会暴露对象的实现细节,从而破坏封装性时。
- 当你希望通过保存对象状态的历史记录来实现撤销/重做操作时。
结构
备忘录模式由以下组件组成:
- 发起人(Originator):发起人是拥有内部状态的对象,它可以创建备忘录对象并从备忘录对象中恢复状态。
- 备忘录(Memento):备忘录是存储发起人对象内部状态的对象。备忘录可以包含发起人的部分或全部状态信息。
- 管理者(Caretaker):管理者负责存储和管理备忘录对象。它可以保存多个备忘录对象,并在需要时将其提供给发起人进行状态恢复。
示例
<?php
// 备忘录
class Memento
{
private $state;
public function __construct($state)
{
$this->state = $state;
}
public function getState()
{
return $this->state;
}
}
// 发起人
class Originator
{
private $state;
public function setState($state)
{
$this->state = $state;
}
public function getState()
{
return $this->state;
}
public function save()
{
return new Memento($this->state);
}
public function restore(Memento $memento)
{
$this->state = $memento->getState();
}
}
// 管理者
class Caretaker
{
private $mementos = [];
public function addMemento(Memento $memento)
{
$this->mementos[] = $memento;
}
public function getMemento($index)
{
return $this->mementos[$index];
}
}
// 客户端代码
$originator = new Originator();
$caretaker = new Caretaker();
$originator->setState("State 1");
$caretaker->addMemento($originator->save());
$originator->setState("State 2");
$caretaker->addMemento($originator->save());
$originator->setState("State 3");
// 恢复到第一个备忘录
$originator->restore($caretaker->getMemento(0));
echo $originator->getState() . PHP_EOL; // 输出: State 1
// 恢复到第二个备忘录
$originator->restore($caretaker->getMemento(1));
echo $originator->getState() . PHP_EOL; // 输出: State 2
在上面的示例中,我们给出了一个备忘录模式的示例实现。其中,我们定义了备忘录(Memento
)类,发起人(Originator
)类和管理者(Caretaker
)类。发起人类负责创建备忘录对象和恢复状态,而管理者类负责存储和管理备忘录对象。