翼度科技»论坛 编程开发 PHP 查看内容

浅谈PHP设计模式的备忘录模式

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
简介:

备忘录模式,属于行为型的设计模式。
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
备忘录模式顾名思义,就是存档功能,类似Git工具,每次提交都相当于一次备份。
主要有一下角色构成
Memento —— 负责存储 Originator 的 唯一内部状态 ,它可以包含: string,number, array,类的实例等等。Memento 「不是公开的类」(任何人都不应该且不能更改它),并防止 Originator 以外的对象访问它,它提供 2 个接口:Caretaker 只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator 却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
Originator —— 它负责创建 Memento  ,并记录 外部对象当前时刻的状态, 并可使用 Memento 恢复内部状态。Originator 可根据需要决定 Memento 存储 Originator 的哪些内部状态。 Originator 也许(不是应该)有自己的方法(methods)。 但是,他们 不能更改已保存对象的当前状态。
Caretaker —— 负责保存 Memento。 它可以修改一个对象;决定 Originator 中对象当前时刻的状态; 从 Originator 获取对象的当前状态; 或者回滚 Originator 中对象的状态。
适用场景:

任何撤销操作的后悔药,前提是有备份。
优点:

任何撤销操作的后悔药,前提是有备份。
缺点:

存档的过程会带来性能问题。
代码:

  1. //原发器,也可以叫做发起人。它有一个内部状态(state),这个状态可以在不同的情况下进行改变。当某一个事件发生时,需要将这个状态恢复到原先的状态。在这里,我们有一个CreateMemento()用于创建一个备忘录(存档),有一个SetMeneto()用于还原状态(读档)。
  2. class Originator
  3. {
  4.     private $state;
  5.     public function SetMeneto(Memento $m)
  6.     {
  7.         $this->state = $m->GetState();
  8.     }
  9.     public function CreateMemento()
  10.     {
  11.         $m = new Memento();
  12.         $m->SetState($this->state);
  13.         return $m;
  14.     }
  15.     public function SetState($state)
  16.     {
  17.         $this->state = $state;
  18.     }
  19.     public function ShowState()
  20.     {
  21.         echo $this->state, PHP_EOL;
  22.     }
  23. }
  24. //备忘录,非常简单,就是用于记录状态。将这个状态以对象的形式保存,就可以让原发器非常方便地创建很多存档用于记录各种不同的状态。
  25. class Memento
  26. {
  27.     private $state;
  28.     public function SetState($state)
  29.     {
  30.         $this->state = $state;
  31.     }
  32.     public function GetState()
  33.     {
  34.         return $this->state;
  35.     }
  36. }
  37. //负责人,也叫做管理者类,保存备忘录,当需要的时候从这里取出备忘录。它只负责保存,不能修改备忘录。在复杂的应用中,可以将这里做成列表,就像游戏中可以选择性的展现多条存档记录供玩家选择。
  38. class Caretaker
  39. {
  40.     private $memento;
  41.     public function SetMemento($memento)
  42.     {
  43.         $this->memento = $memento;
  44.     }
  45.     public function GetMemento()
  46.     {
  47.         return $this->memento;
  48.     }
  49. }
  50. //调用端==================================================
  51. //客户端的调用中,我们的原发器初始化状态后进行了保存,然后人为的更改了状态。这时只需要通过负责人将状态还原回来就可以了。
  52. $o = new Originator();
  53. $o->SetState('状态1');
  54. $o->ShowState();
  55. // 保存状态
  56. $c = new Caretaker();
  57. $c->SetMemento($o->CreateMemento());
  58. $o->SetState('状态2');
  59. $o->ShowState();
  60. // 还原状态
  61. $o->SetMeneto($c->GetMemento());
  62. $o->ShowState();
复制代码
来源:https://www.cnblogs.com/phpphp/p/16880837.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具