namespace DesignPatterns\Behavioral\Memento\Tests;

use DesignPatterns\Behavioral\Memento\Caretaker;

use DesignPatterns\Behavioral\Memento\Memento;

use DesignPatterns\Behavioral\Memento\Originator;

/**

* MementoTest用于测试备忘录模式

*/

class MementoTest extends \PHPUnit_Framework_TestCase

{

public function testUsageExample()

{

$originator = new Originator();

$caretaker = new Caretaker();

$character = new \stdClass();

// new object

$character->name = "Gandalf";

// connect Originator to character object

$originator->setState($character);

// work on the object

$character->name = "Gandalf the Grey";

// still change something

$character->race = "Maia";

// time to save state

$snapshot = $originator->getStateAsMemento();

// put state to log

$caretaker->saveToHistory($snapshot);

// change something

$character->name = "Sauron";

// and again

$character->race = "Ainur";

// state inside the Originator was equally changed

$this->assertAttributeEquals($character, "state", $originator);

// time to save another state

$snapshot = $originator->getStateAsMemento();

// put state to log

$caretaker->saveToHistory($snapshot);

$rollback = $caretaker->getFromHistory(0);

// return to first state

$originator->restoreFromMemento($rollback);

// use character from old state

$character = $rollback->getState();

// yes, that what we need

$this->assertEquals("Gandalf the Grey", $character->name);

// make new changes

$character->name = "Gandalf the White";

// and Originator linked to actual object again

$this->assertAttributeEquals($character, "state", $originator);

}

public function testStringState()

{

$originator = new Originator();

$originator->setState("State1");

$this->assertAttributeEquals("State1", "state", $originator);

$originator->setState("State2");

$this->assertAttributeEquals("State2", "state", $originator);

$snapshot = $originator->getStateAsMemento();

$this->assertAttributeEquals("State2", "state", $snapshot);

$originator->setState("State3");

$this->assertAttributeEquals("State3", "state", $originator);

$originator->restoreFromMemento($snapshot);

$this->assertAttributeEquals("State2", "state", $originator);

}

public function testSnapshotIsClone()

{

$originator = new Originator();

$object = new \stdClass();

$originator->setState($object);

$snapshot = $originator->getStateAsMemento();

$object->new_property = 1;

$this->assertAttributeEquals($object, "state", $originator);

$this->assertAttributeNotEquals($object, "state", $snapshot);

$originator->restoreFromMemento($snapshot);

$this->assertAttributeNotEquals($object, "state", $originator);

}

public function testCanChangeActualState()

{

$originator = new Originator();

$first_state = new \stdClass();

$originator->setState($first_state);

$snapshot = $originator->getStateAsMemento();

$second_state = $snapshot->getState();

// still actual

$first_state->first_property = 1;

// just history

$second_state->second_property = 2;

$this->assertAttributeEquals($first_state, "state", $originator);

$this->assertAttributeNotEquals($second_state, "state", $originator);

$originator->restoreFromMemento($snapshot);

// now it lost state

$first_state->first_property = 11;

// must be actual

$second_state->second_property = 22;

$this->assertAttributeEquals($second_state, "state", $originator);

$this->assertAttributeNotEquals($first_state, "state", $originator);

}

public function testStateWithDifferentObjects()

{

$originator = new Originator();

$first = new \stdClass();

$first->data = "foo";

$originator->setState($first);

$this->assertAttributeEquals($first, "state", $originator);

$first_snapshot = $originator->getStateAsMemento();

$this->assertAttributeEquals($first, "state", $first_snapshot);

$second = new \stdClass();

$second->data = "bar";

$originator->setState($second);

$this->assertAttributeEquals($second, "state", $originator);

$originator->restoreFromMemento($first_snapshot);

$this->assertAttributeEquals($first, "state", $originator);

}

public function testCaretaker()

{

$caretaker = new Caretaker();

$memento1 = new Memento("foo");

$memento2 = new Memento("bar");

$caretaker->saveToHistory($memento1);

$caretaker->saveToHistory($memento2);

$this->assertAttributeEquals(array($memento1, $memento2), "history", $caretaker);

$this->assertEquals($memento1, $caretaker->getFromHistory(0));

$this->assertEquals($memento2, $caretaker->getFromHistory(1));

}

public function testCaretakerCustomLogic()

{

$caretaker = new Caretaker();

$result = $caretaker->runCustomLogic();

$this->assertEquals("State3", $result);

}

}

php在线备忘录,备忘录模式(Memento)相关推荐

  1. Net设计模式实例之备忘录模式(Memento Pattern)

    一.备忘录模式简介(Brief Introduction) 备忘录模式(Memento Pattern),在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以就该对 ...

  2. 二十四种设计模式:备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern) 介绍 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例 有一个Message实体类 ...

  3. 『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办

    23种设计模式+额外常用设计模式汇总 (持续更新) Memento模式的关键就是要在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态.这样以后就可以利用该保存的状态实施恢复操作. ...

  4. 设计模式-备忘录模式(Memento)-Java

    设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...

  5. java memento_备忘录模式-Memento Pattern(Java实现)

    备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...

  6. 【学习笔记】设计模式-备忘录模式(Memento)

    文章目录 0 设计模式 1 备忘录模式 2 实现思路 3 需要的类 4 具体实现 4.1 Memento(备忘录) 4.2 Originator(目标对象) 4.3 CareTaker(管理者) 4. ...

  7. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少人的心弦,一段五百年都没有结 ...

  8. Java备忘录模式(Memento)

      本文我们来介绍下java23种设计模式中的备忘录模式. 备忘录模式Memento 使用场景 录入大批人员资料.正在录入当前人资料时,发现上一个人录错了, 此时需要恢复上一个人的资料,再进行修改. ...

  9. php备忘录,备忘录模式及其php实现

    备忘录模式是一种行为型模式,它在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样可以在以后把该对象的状态恢复到之前保存的状态. 主要角色 备忘录(Memento)角色:存 ...

最新文章

  1. python调用函数出现未定义_python – 为什么函数参数之外的“self”会给出“未定义”的错误?...
  2. python输出csv文件-Python之读取与写入CSV文件
  3. C#中json序列化与反序列化
  4. 升级php7_PhpStorm 2019.3 发布,全面支持 PHP 7.4
  5. ARMv9刷屏 —— 号称十年最大变革,Realm机密计算技术有什么亮点?
  6. eclipse 增加php 版本号,扩充eclipse php的代码提示功能
  7. vue获取tr内td里面所有内容_vue 项目学习
  8. GJM:C# WinForm开发系列 - DataGridView 使用方法集锦 [转载]
  9. 多对多表的创建方式 forms组件 session与cookie
  10. 调试工具之modscan使用介绍
  11. 小学数学计算机按键名称,数学计算器
  12. matlab中mapminmax()函数的用法
  13. MUI框架开发APP详解,一篇就够了
  14. 联想YOGA 13笔记本电源适配器修理
  15. web前端期末大作业 html+css+javascript网页设计实例——端午节日(25页) 图片滚动
  16. 实际应用Supervisor部署Flask项目
  17. MySQL三个表的连接查询
  18. DITHER 抖动算法(转载)
  19. Python 税额计算器
  20. 用Meta标签代码让360双核浏览器默认极速模式不是兼容模式

热门文章

  1. Flash Builder 4.7 安装
  2. Flask + Nginx + React + Webpack 配置解决跨域问题
  3. Sphinx武林秘籍(上)
  4. log4j打印mybatis执行的sql
  5. 编译mgiza的准备
  6. 可在广域网部署运行的QQ高仿版 -- GG叽叽(开源)
  7. r230/r250/m200
  8. 玻璃质感_他的玻璃质感让人佩服的五体投地
  9. python嵌套循环效率_Python嵌套循环数组比较优化的可能性?
  10. linux注入内存泄露,Linux 内存泄露小结