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

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

    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();

    总结:

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

    代码无措未必优

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

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

    上一章:第十七章 在NBA我需要翻译 --- 适配器模式

    下一章:第十九章 分公司 = 一部分 --- 组合模式