声明:本系列博客參考资料《大话设计模式》,作者程杰。

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

UML类图:

角色:

1.发起人(GameRole):负责创建一个备忘录,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。发起人能够依据须要决定备忘录存储自己的哪些内部状态。

2.备忘录(RoleStateSaveBox):负责存储发起人对象的内部状态,并能够防止发起人以外的其它对象訪问备忘录。备忘录有两个接口:管理者仅仅能看到备忘录的窄接口,他仅仅能将备忘录传递给其它对象。发起人却可看到备忘录的宽接口。同意它訪问返回到先前状态所须要的全部数据。

3.管理者(GameRoleStateManager):负责存取备忘录,不能对的内容进行訪问或者操作。

核心代码: 

<?

php
/**
* Created by PhpStorm.
* User: Jang
* Date: 2015/6/10
* Time: 9:49
*/ //游戏角色
class GameRole
{
#region 游戏角色状态属性(生命力、攻击力、防御力)
public $liveLevel; public $attackLevel; public $defenseLevel;
#endregion //保存状态
public function SaveState()
{
return (new RoleStateMemento($this->liveLevel,$this->attackLevel,$this->defenseLevel));
} //恢复状态
public function RecoveryState(RoleStateMemento $_memento)
{
$this->liveLevel = $_memento->liveLevel;
$this->attackLevel = $_memento->attackLevel;
$this->defenseLevel = $_memento->defenseLevel;
} //------------其它属性及操作--------------
//获得初始状态
public function GetInitState()
{
$this->defenseLevel = 100;
$this->attackLevel = 100;
$this->liveLevel = 100;
} //状态显示
public function StateDisplay()
{
echo "角色状态:<br/>";
echo "生命力:{$this->liveLevel}<br/>";
echo "攻击力:{$this->attackLevel}<br/>";
echo "防御力:{$this->defenseLevel}<br/>";
} //被攻击
public function BeenAttack()
{
$this->liveLevel -= 9.5;
if($this->liveLevel<=0)
{
$this->liveLevel = 0;
echo "呃,该角色阵亡了!<br/>";
echo "Game Over!<br/>";
return;
} $this->attackLevel -= 1.1;
if($this->attackLevel<=0)
{
$this->attackLevel = 0;
} $this->defenseLevel -= 0.5;
if($this->defenseLevel<=0)
{
$this->defenseLevel = 0;
}
}
} //角色状态存储箱类
class RoleStateMemento
{
public $liveLevel;
public $attackLevel;
public $defenseLevel; public function RoleStateMemento($_ll,$_al,$_dl)
{
$this->liveLevel=$_ll;
$this->attackLevel=$_al;
$this->defenseLevel=$_dl;
}
} //游戏角色状态管理者类
class RoleStateManager
{
public $memento;
}

測试代码:       

<?php
/**
* Created by PhpStorm.
* User: Jang
* Date: 2015/6/10
* Time: 10:02
*/ header("Content-Type:text/html;charset=utf-8");
//-------------------------备忘录模式------------------------
require_once "./Memento/Memento.php"; //开战前
$ufo = new GameRole();
$ufo->GetInitState();
echo "<span style='color:#ff0000'>----------------开战前-----------------</span><br/>";
$ufo->StateDisplay(); //保存进度
$roleMan = new RoleStateManager();
$roleMan->memento = $ufo->SaveState(); echo "<span style='color:#ff0000'>----------------战斗中-----------------</span><br/>";
$num=1;
//大战Boss5个回合
for ($i = 0; $i <13;$i++ )
{
echo "-------------第{$num}回合-------------<br/>";
$ufo->BeenAttack();
$ufo->StateDisplay();
$num++;
//角色阵亡
if($ufo->liveLevel<=0)
{
break;
}
} echo "<span style='color:#ff0000'>----------------恢复状态-----------------</span><br/>";
//恢复之前状态
$ufo->RecoveryState($roleMan->memento);
$ufo->StateDisplay();

长处:

1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方。可是必需要由发起人对象自己读取。这时,使用备忘录模式能够把复杂的发起人内部信息对其它的对象屏蔽起来,从而能够恰当地保持封装的边界。

2、本模式简化了发起人类。

发起人不再须要管理和保存其内部状态的一个个版本号,client能够自行管理他们所须要的这些状态的版本号。

缺点:

1、假设发起人角色的状态须要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会非常昂贵。

2、当负责人角色将一个备忘录存储起来的时候。负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否非常昂贵。

欢迎关注我的视频课程。地址例如以下,谢谢。

PHP面向对象设计模式

最新文章

  1. js实现由分隔栏决定两侧div的大小—js动态分割div
  2. zeromq中两个dealer 通过一个router进行通信
  3. LPC43xx I2S
  4. 如何通过linux ssh远程linux不用输入密码登入
  5. c语言 指针的值
  6. IOS 开发中判断字符串是否为空字符的方法
  7. C#字符串与char数组互转!
  8. 发布到IIS后 程序乱码
  9. linux查看系统的日志的一些实用操作
  10. TableView cell自适应高度-----xib
  11. Consecutive Subsequence CodeForces - 977F (map优化DP)&#183;
  12. NSL:CPK_NN神经网络实现预测哪个样本与哪个样本处在同一层,从而科学规避我国煤矿突水灾难—Jason niu
  13. [OC] 使用 cocoaPods 导入 AFNetworking
  14. angular2项目关于Echarts图表的处理
  15. 制作Wi-Fi Ducky远程HID攻击设备
  16. pandas 常用清洗数据(一)
  17. 发送邮件(单独文字)的方法(网易邮箱 OR QQ邮箱)
  18. 机器学习之路:python支持向量机回归SVR 预测波士顿地区房价
  19. 后台管理系统-使用AdminLTE搭建前端
  20. MySQL设置远程连接服务器

热门文章

  1. java日历程序版本
  2. 黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block
  3. 获取编译学习笔记 (六)—— si、di,双环
  4. 认为C/C++很难理解、找工作面试笔试,快看看这本书!
  5. windows phone (22) 隐藏元素
  6. Android在浏览器启动APP
  7. poj 2253 Frogger (最长路中的最短路)
  8. 第三届蓝桥杯Java高职组决赛第三题
  9. oracle表空间查询维护命令大全之三(暂时表空间)史上最全
  10. javascript从定义到执行 js引擎 闭包