大数跨境
0
0

备份设计模式

备份设计模式 云容灾备份安全治理
2018-08-10
2
导读:备份设计模式,需要备份的对象自身有备份录,外部还有一个备份的管理者,当对象中有对象需要备份的时候,自己生成一

备份设计模式,需要备份的对象自身有备份录,外部还有一个备份的管理者,当对象中有对象需要备份的时候,自己生成一个备份录并在管理者中进行管理,当对象数据需要恢复的时候,在从管理者中得到备份录,供对象进行数据恢复。

备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。

涉及到三个角色:

发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。

备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。

管理角色:对备忘录进行管理,保存和提供备忘录。

意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

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

何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。

如何解决:通过一个备忘录类专门存储对象状态。

关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。

应用实例:1、后悔药。2、打游戏时的存档。3、Windows 里的 ctri + z。4、IE 中的后退。4、数据库的事务管理。

优点:1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

使用场景:1、需要保存/恢复数据的相关状态场景。2、提供一个可回滚的操作。

注意事项:1、为了符合迪米特原则,还要增加一个管理备忘录的类。2、为了节约内存,可使用原型模式+备忘录模式。

下边是个简单的例子,只备份了一个字符串,理论上时可以备份任何数据的:


  
  1. <?php

  2. //发起者

  3. class Originator{

  4. //备份的数据,可以任何对象

  5. private $State;

  6. function SetState($State)

  7. {

  8. $this->State = $State;

  9. }

  10. function GetState()

  11. {

  12. echo " State is ".$this->State;

  13. }

  14. //得到一个新的备份

  15. function CreateMemento()

  16. {

  17. return new Memento($this->State);

  18. }

  19. //从备份中恢复数据

  20. function RestoreMemento(Memento $Memento)

  21. {

  22. $this->SetState($Memento->GetState());

  23. }

    }

    //备忘录

  24. class Memento{

  25. private $State;

  26. //备份

  27. function __construct($State)

  28. {

  29. $this->State = $State;

  30. }

  31. function SetState($State)

  32. {

  33. $this->State = $State;

  34. }

  35. //获取备份

  36. function GetState()

    {

    return  $this->State;

  37. }

  38. }

    //管理者

  39. class Caretaker{

  40. private $Memento;

  41. function __construct(Memento $Memento)

  42. {

  43. $this->Memento = $Memento;

  44. }

  45. function  GetMemento(){

  46. return $this->Memento;

  47. }

  48. function SetMemento(Memento $Memento){

  49. $this->Memento = $Memento;

  50. }

    }

    //调用

  51. //发起者对象-赋值

  52. $Originator = new Originator();

  53. $Originator->SetState("StateA");

  54. $Originator->GetState();

  55. //备份管理者进行备份

  56. $Caretaker = new Caretaker($Originator->CreateMemento());

  57. //发起者修改数据

  58. $Originator->SetState("StateB");

  59. $Originator->GetState();

  60. //进行备份恢复

  61. $Originator->RestoreMemento($Caretaker->GetMemento());

  62. $Originator->GetState();


【声明】内容源于网络
0
0
云容灾备份安全治理
分享云灾备规划、实施、运营、备份与恢复、数据安全、数据治理;窥视国内外备份软件与监控软件知识前沿水平线; 越努力,越幸运!
内容 2171
粉丝 0
云容灾备份安全治理 分享云灾备规划、实施、运营、备份与恢复、数据安全、数据治理;窥视国内外备份软件与监控软件知识前沿水平线; 越努力,越幸运!
总阅读4.1k
粉丝0
内容2.2k