备忘录模式:
  又叫做快照模式或Token模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

角色:
  1.创建者:负责创建一个备忘录,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。发起人可以根据需要决定备忘录存储自己的哪些内部状态。
  2.备忘录:负责存储发起人对象的内部状态,并可以防止发起人以外的其他对象访问备忘录。备忘录有两个接口:管理者只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。发起人却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
  3.管理者:负责存取备忘录,不能对的内容进行访问或者操作。

UML类图:

   

适用性:
  必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。
  如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

代码实现:

  1. <?php
  2. header("Content-type:text/html;Charset=utf-8");
  3.  
  4. //备忘录
  5. class Memento{
  6. public $id;
  7. public $name;
  8. public $liveLevel;
  9.  
  10. function __construct($id,$name,$liveLevel){
  11. $this->id = $id;
  12. $this->name = $name;
  13. $this->liveLevel = $liveLevel;
  14. }
  15. }
  16.  
  17. //备忘录管理器
  18. class Originator{
  19. public static $mementos = array();
  20. private static $instance = null;
  21.  
  22. //单例模式确保只有一个管理器
  23. private function __construct(){
  24.  
  25. }
  26. //返回单例对象
  27. static function getInstance(){
  28. if(!(self::$instance instanceOf slef)){
  29. self::$instance = new self();
  30. }
  31. return self::$instance;
  32. }
  33. //存备忘录
  34. function setMemento($id,Memento $memento){
  35. self::$mementos[$id] = $memento;
  36. }
  37. //取备忘录
  38. function getMemento($id){
  39. return self::$mementos[$id];
  40. }
  41. }
  42.  
  43. //创建者,玩家,可存取自身状态
  44. class Player{
  45. private static $i = 0; //静态变量累加用于给$id赋值
  46. public $id; //每个对象独一无二,用于保存状态备忘录到管理器
  47. private $name; //姓名
  48. private $liveLevel; //生命值
  49.  
  50. function __construct($name){
  51. $this->name = $name;
  52. $this->id = self::$i;
  53. self::$i++;
  54. }
  55. //初始化
  56. function init(){
  57. $this->liveLevel = 100;
  58. }
  59.  
  60. //生命值减少10
  61. function damage(){
  62. $this->liveLevel -=10;
  63. }
  64.  
  65. //显示现有状态
  66. function displayState(){
  67. echo "姓 名:".$this->name."<br/>";
  68. echo "生命值:".$this->liveLevel."<br/>";
  69. }
  70.  
  71. //保存状态到一个备忘录中,该备忘录将被放置到管理器中
  72. function saveState(){
  73. $originator = Originator::getInstance();
  74. $originator->setMemento($this->id,new Memento($this->id,$this->name,$this->liveLevel));
  75. }
  76. //恢复备忘录
  77. function getState(){
  78. $originator = Originator::getInstance();
  79. $memento = $originator->getMemento($this->id);
  80. $this->id = $memento->id;
  81. $this->name = $memento->name;
  82. $this->liveLevel = $memento->liveLevel;
  83. }
  84. }
  85.  
  86. //测试
  87. //创建、初始化角色并显示状态
  88. $player = new Player("张三");
  89. $player->init();
  90. $player->displayState(); //生命值100
  91.  
  92. //开始游戏前存档
  93. $player->saveState();
  94.  
  95. //开始游戏,收到伤害生命值减少,显示状态
  96. $player->damage();
  97. $player->damage();
  98. $player->displayState(); //生命值80
  99.  
  100. //回档恢复原来状态,显示状态
  101. $player->getState();
  102. $player->displayState(); //生命值100
  103.  
  104. ?>

备忘录模式及php实现的更多相关文章

  1. MementoPattern(备忘录模式)

    /** * 备忘录模式 * @author TMAC-J * 用于存储bean的状态 */ public class MementoPattern { public class Memento{ pr ...

  2. C#设计模式-备忘录模式

    访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘 ...

  3. C#设计模式系列:备忘录模式(Memento)

    1.备忘录模式简介 1.1>.定义 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 1.2>.使用频率 ...

  4. php实现设计模式之 备忘录模式

    <?php /*备忘录模式:在不破坏封装的前提下,获取对象的内部状态,并且在对象外保存该状态.这样就可以将该对象恢复到保存之前的状态(行为模式) * * 发起人:记录当前时刻的内部状态,负责定义 ...

  5. java设计模式之备忘录模式

    备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.一听到备忘录这个字的时候想起了小小时打的游 ...

  6. 备忘录模式(Memento Pattern)

    在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 备忘录模式主要思想是——利用备忘录对象来对保存发起人的内部状态,当发起人需要恢复原 ...

  7. C++设计模式-Memento备忘录模式

    Memento模式作用:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. UML图: Originator:负责创建一个备忘录Me ...

  8. C++设计模式-备忘录模式(1)

    备忘录模式:备忘录对象时一个用来存储另外一个对象内部状态的快照对象. 备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住并外部化,存储起来从而可以在将来合适的时候把这个对象还原到存储起来的状 ...

  9. JAVA 设计模式 备忘录模式

    用途 备忘录模式 (Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 备忘录模式是一种行为型模式. 结构

  10. 【GOF23设计模式】备忘录模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_备忘录模式.多点备忘.事务操作.回滚数据底层架构 package com.test.memento; /** * 源发器类 ...

随机推荐

  1. (linux)初学者学linux块设备驱动

      面对不断升级的linux内核.GNU开发工具.linux环境下的各种图形库,很多linux应用程序开发人员和linux设备驱动开发人员即兴奋,又烦躁.兴奋的是新的软件软件.工具给我提供了更强大的功 ...

  2. CentOS 7.2 安装Gerrit 2.14.6

    1.环境 本文使用VMWare虚拟机进行实验. 2核CPU,4GB内存,20GB硬盘,IP:192.168.159.131 CentOS 7.2最小安装(CentOS-7-x86_64-Minimal ...

  3. RedisCluster集群搭建

    搭建集群方案 安装部署任何一个应用其实都很简单,只要安装步骤一步一步来就行了.下面说一下 Redis 集群搭建规划,由于集群至少需要6个节点(3主3从模式),所以,没有这么多机器给我玩,我本地也起不了 ...

  4. “There's no Qt version assigned to this project for platform ” - visual studio plugin for Qt

    1.find menu "Qt VS Tools", select Qt Options 2.add a new Qt version 3. right click the tar ...

  5. EOS智能合约为何选择Web Assembly(wasm)

    比特币的程序非常简单,由解锁脚本和锁定脚本构成.以太坊有智能合约,有图灵完备的虚拟机EVM,但是指令也相对简单,且自成一套.这两种程序本质上都是脚本程序,即由程序翻译指令并执行,而不是由本地机器CPU ...

  6. 使用PHP对word文档进行操作的方法

    使用php时,因为加密等原因,如果直接用FILE后者OPEN等函数读取WORD的话往往是乱码,原来要使用COM 这是我简单的一个读取并存储到新的WORD上的文件<? // 建立一个指向新COM组 ...

  7. Identifier expected after this token

    Cursor cursor = db.query(true, "user", new String[]{"id","mode"}, &quo ...

  8. EOJ Monthly 2018.4 (E.小迷妹在哪儿(贪心&排序&背包)

    ultmaster 男神和小迷妹们玩起了捉迷藏的游戏. 小迷妹们都希望自己被 ultmaster 男神发现,因此她们都把自己位置告诉了 ultmaster 男神,因此 ultmaster 男神知道了自 ...

  9. python之路,day7-面向对象变成

    本篇内容: 面向对象.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法: #@staticmethod只是名义上归类管理,实际上跟类没什么关系 ...

  10. CentOS-用户的管理

    用户组及配置文件 用户的类型 Linux是一个多用户.多任务的操作系统,如果要使用系统资源,就必须向系统管理员申请一个用户,通过这个用户进入系统,通过建立不同属性的用户实现不同的作用或权限,可以合理利 ...