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

备忘录模式又叫做快照模式或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面向对象设计模式

PHP设计模式——备忘录模式的更多相关文章

  1. [转] Android中的设计模式-备忘录模式

    转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫 ...

  2. Java设计模式—备忘录模式

    个人感觉备忘录模式是一个比较难的设计模式,备忘录模式就是一个对象的备份模式,提供了一种程序数据的备份方法. 定义如下:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以 ...

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

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

  4. [工作中的设计模式]备忘录模式memento

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

  5. 深入浅出设计模式——备忘录模式(Memento Pattern)

    模式动机 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取 ...

  6. IOS设计模式-备忘录模式

    内容大纲 如何存储记录 备忘录模式的基本原理 使用备忘录模式 优化存储方案 恢复UIView的状态 1.如何存储记录 在存储记录时,第一步我们需要用一把钥匙去打开一把锁.第二步,当我们打开锁之后就会有 ...

  7. java设计模式---备忘录模式

    一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...

  8. C++设计模式——备忘录模式

    备忘录模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢 ...

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

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

随机推荐

  1. M3U8格式解说及实际应用分析

    M3U8有啥优点 ? 网上搜索了一下,大家众说纷纭,个人理解主要是能够做多码率的适配,依据网络带宽,client会选择一个适合自己码率的文件进行播放,保证视频流的流畅. 在IOS device和mac ...

  2. eclipse 重构(转)

    Eclipse中的重构类型        如果你看一下Eclipse的重构菜单,可以看到四部分.第一部分是撤销和重做.其他的三部分包含Eclipse提供的三种类型的重构. 第一种类型的重构改变代码的物 ...

  3. Spring整合JMS-基于activeMQ实现(二)

    Spring整合JMS-基于activeMQ实现(二) 1.消息监听器      在Spring整合JMS的应用中我们在定义消息监听器的时候一共能够定义三种类型的消息监听器,各自是MessageLis ...

  4. Spring官方网站的改版后下载

    Spring官方网站改版很长一段时间后还没有找到直接下载Jar链接包,下面总结了一些方法,可在网上,亲測可用. 1.直接输入地址,改对应版本号就可以:http://repo.springsource. ...

  5. Linux学习笔记——例说makefile 头文件查找路径

    0.前言     从学习C语言開始就慢慢開始接触makefile,查阅了非常多的makefile的资料但总感觉没有真正掌握makefile,假设自己动手写一个makefile总认为非常吃力.所以特意借 ...

  6. Mac下改动Android Studio 所用的JDK版本号

    Mac下改动Android Studio 所用的JDK版本号 @author ASCE1885 近期项目从Eclipse+Ant构建模式转移到了Android Studio+Gradle构建模式.自然 ...

  7. 采用jqueryUI创建日期选择器

    该公司的项目使用的插件时间选择,百度很长一段时间.没有找到合适的,而且,他们在看了jqueryUI.自己变成一个更好的集成日期选择器.为了以后遇到相同的问题是可以解决. 以下就贴出部分使用的代码,比較 ...

  8. Linux/UNIX流程关系

    流程关系 过程组 除了一个过程,每个过程ID此外.也属于一个进程组.过程基是一个或多个过程的集合. 通常它们与相同的作业相关联,它接受各种信号从相同终端. #include<unistd.h&g ...

  9. WPF技术触屏上的应用系列(一): 3D 图片(照片)墙、柱面墙(凹面墙或者叫远景墙、凸面墙或者叫近景墙)实现

    原文:WPF技术触屏上的应用系列(一): 3D 图片(照片)墙.柱面墙(凹面墙或者叫远景墙.凸面墙或者叫近景墙)实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7 ...

  10. 剑指offer 例题

    题目: 实现一个排序算法,排序对象是本公司员工的年龄.要求时间复杂度O(n),空间复杂度不能超过O(n). #include<iostream> using namespace std; ...