|
简介:
备忘录模式,属于行为型的设计模式。
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
备忘录模式顾名思义,就是存档功能,类似Git工具,每次提交都相当于一次备份。
主要有一下角色构成
Memento —— 负责存储 Originator 的 唯一内部状态 ,它可以包含: string,number, array,类的实例等等。Memento 「不是公开的类」(任何人都不应该且不能更改它),并防止 Originator 以外的对象访问它,它提供 2 个接口:Caretaker 只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator 却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
Originator —— 它负责创建 Memento ,并记录 外部对象当前时刻的状态, 并可使用 Memento 恢复内部状态。Originator 可根据需要决定 Memento 存储 Originator 的哪些内部状态。 Originator 也许(不是应该)有自己的方法(methods)。 但是,他们 不能更改已保存对象的当前状态。
Caretaker —— 负责保存 Memento。 它可以修改一个对象;决定 Originator 中对象当前时刻的状态; 从 Originator 获取对象的当前状态; 或者回滚 Originator 中对象的状态。
适用场景:
任何撤销操作的后悔药,前提是有备份。
优点:
任何撤销操作的后悔药,前提是有备份。
缺点:
存档的过程会带来性能问题。
代码:
- //原发器,也可以叫做发起人。它有一个内部状态(state),这个状态可以在不同的情况下进行改变。当某一个事件发生时,需要将这个状态恢复到原先的状态。在这里,我们有一个CreateMemento()用于创建一个备忘录(存档),有一个SetMeneto()用于还原状态(读档)。
- class Originator
- {
- private $state;
- public function SetMeneto(Memento $m)
- {
- $this->state = $m->GetState();
- }
- public function CreateMemento()
- {
- $m = new Memento();
- $m->SetState($this->state);
- return $m;
- }
- public function SetState($state)
- {
- $this->state = $state;
- }
- public function ShowState()
- {
- echo $this->state, PHP_EOL;
- }
- }
- //备忘录,非常简单,就是用于记录状态。将这个状态以对象的形式保存,就可以让原发器非常方便地创建很多存档用于记录各种不同的状态。
- class Memento
- {
- private $state;
- public function SetState($state)
- {
- $this->state = $state;
- }
- public function GetState()
- {
- return $this->state;
- }
- }
- //负责人,也叫做管理者类,保存备忘录,当需要的时候从这里取出备忘录。它只负责保存,不能修改备忘录。在复杂的应用中,可以将这里做成列表,就像游戏中可以选择性的展现多条存档记录供玩家选择。
- class Caretaker
- {
- private $memento;
- public function SetMemento($memento)
- {
- $this->memento = $memento;
- }
- public function GetMemento()
- {
- return $this->memento;
- }
- }
- //调用端==================================================
- //客户端的调用中,我们的原发器初始化状态后进行了保存,然后人为的更改了状态。这时只需要通过负责人将状态还原回来就可以了。
- $o = new Originator();
- $o->SetState('状态1');
- $o->ShowState();
- // 保存状态
- $c = new Caretaker();
- $c->SetMemento($o->CreateMemento());
- $o->SetState('状态2');
- $o->ShowState();
- // 还原状态
- $o->SetMeneto($c->GetMemento());
- $o->ShowState();
复制代码 来源:https://www.cnblogs.com/phpphp/p/16880837.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|