php在线备忘录,备忘录模式(Memento)
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)相关推荐
- Net设计模式实例之备忘录模式(Memento Pattern)
一.备忘录模式简介(Brief Introduction) 备忘录模式(Memento Pattern),在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以就该对 ...
- 二十四种设计模式:备忘录模式(Memento Pattern)
备忘录模式(Memento Pattern) 介绍 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例 有一个Message实体类 ...
- 『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办
23种设计模式+额外常用设计模式汇总 (持续更新) Memento模式的关键就是要在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态.这样以后就可以利用该保存的状态实施恢复操作. ...
- 设计模式-备忘录模式(Memento)-Java
设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...
- java memento_备忘录模式-Memento Pattern(Java实现)
备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...
- 【学习笔记】设计模式-备忘录模式(Memento)
文章目录 0 设计模式 1 备忘录模式 2 实现思路 3 需要的类 4 具体实现 4.1 Memento(备忘录) 4.2 Originator(目标对象) 4.3 CareTaker(管理者) 4. ...
- 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)
备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少人的心弦,一段五百年都没有结 ...
- Java备忘录模式(Memento)
本文我们来介绍下java23种设计模式中的备忘录模式. 备忘录模式Memento 使用场景 录入大批人员资料.正在录入当前人资料时,发现上一个人录错了, 此时需要恢复上一个人的资料,再进行修改. ...
- php备忘录,备忘录模式及其php实现
备忘录模式是一种行为型模式,它在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样可以在以后把该对象的状态恢复到之前保存的状态. 主要角色 备忘录(Memento)角色:存 ...
最新文章
- python调用函数出现未定义_python – 为什么函数参数之外的“self”会给出“未定义”的错误?...
- python输出csv文件-Python之读取与写入CSV文件
- C#中json序列化与反序列化
- 升级php7_PhpStorm 2019.3 发布,全面支持 PHP 7.4
- ARMv9刷屏 —— 号称十年最大变革,Realm机密计算技术有什么亮点?
- eclipse 增加php 版本号,扩充eclipse php的代码提示功能
- vue获取tr内td里面所有内容_vue 项目学习
- GJM:C# WinForm开发系列 - DataGridView 使用方法集锦 [转载]
- 多对多表的创建方式 forms组件 session与cookie
- 调试工具之modscan使用介绍
- 小学数学计算机按键名称,数学计算器
- matlab中mapminmax()函数的用法
- MUI框架开发APP详解,一篇就够了
- 联想YOGA 13笔记本电源适配器修理
- web前端期末大作业 html+css+javascript网页设计实例——端午节日(25页) 图片滚动
- 实际应用Supervisor部署Flask项目
- MySQL三个表的连接查询
- DITHER 抖动算法(转载)
- Python 税额计算器
- 用Meta标签代码让360双核浏览器默认极速模式不是兼容模式