第十八章 如果再回到从前 --- 备忘录模式

  1. <?php
  2. //发起人类
  3. class Originator
  4. {
  5. // 需要保存的属性,可能有多个
  6. private $state;
  7. public function setState($state)
  8. {
  9. $this->state = $state;
  10. }
  11. public function getState()
  12. {
  13. return $this->state;
  14. }
  15. //创建备忘录,将当前需要保存的信息导入并实例化出一个memento对象。
  16. public function createMemento()
  17. {
  18. return new Memento($this->state);
  19. }
  20. //恢复备忘录,将memento导入并将相关数据恢复。
  21. public function setMemento(Memento $memento)
  22. {
  23. $this->state = $memento->getState();
  24. }
  25. //显示数据
  26. public function show()
  27. {
  28. echo "status ".$this->state."\n";
  29. }
  30. }
  31. //备忘录类
  32. class Memento
  33. {
  34. private $state;
  35. //构造方法,将相关数据导入
  36. function __construct($state)
  37. {
  38. $this->state = $state;
  39. }
  40. //获取需要保存的数据,可以多个
  41. public function getState()
  42. {
  43. return $this->state;
  44. }
  45. }
  46. //管理者类
  47. class CareTaker
  48. {
  49. private $memento;
  50. public function getMemento()
  51. {
  52. return $this->memento;
  53. }
  54. //设置备忘录
  55. public function setMemento(Memento $memento)
  56. {
  57. $this->memento = $memento;
  58. }
  59. }
  60. //客户端程序
  61. $o = new Originator(); //Originator初始状态,状态属性on
  62. $o->setState("On");
  63. $o->show();
  64. //保存状态时,由于有了很好的封装,可以隐藏Originator的实现细节
  65. $c = new CareTaker();
  66. $c->setMemento($o->createMemento());
  67. // 改变属性
  68. $o->setState("Off");
  69. $o->show();
  70. // 恢复属性
  71. $o->setMemento($c->getMemento());
  72. $o->show();

总结:

备忘录模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之前保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

代码无措未必优

如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。

使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来。