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

备忘录模式又叫做快照模式或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. Java中的反射——(1)什么是反射

    Java程序中的各个Java类属于同一类事物,描写叙述这类事物的Java类名就是Class. public class ReflectTest { public static void main(St ...

  2. Python学习入门基础教程(learning Python)--3.1Python的if分支语句

    本节研究一下if分支语句. if分支语句是Python下逻辑条件控制语句,用于条件执行某些语句的控制操作,当if后的条件conditon满足时,if其下的语句块被执行,但当if的控制条件condito ...

  3. 广东省-IT红黑榜排名公司名称

    红榜Top100 Order Company Name Point Change  1 百富计算机技术(深圳)有限公司  94.00 --  2 中国网通广州分公司  88.00 --  3 深圳市汇 ...

  4. mysql重装后出现乱码解决办法

    查看当前连接系统参数:SHOW VARIABLES LIKE '%char%'; mysql> show variables like 'char%'; +------------------- ...

  5. Android:What is ART?

    背景:Android4.2之前,安卓手机系统的应用程序均在Dalvik Java的虚拟机上执行,这样的执行模式还要依靠一个编译器来实现与应用程序的沟通.应用程序每次执行时,都须要将程序内的代码转变为机 ...

  6. 怎么样Eclipse IDE for C/C++ Developers正确编译GTK规划?(解决)

    <span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 25.99 ...

  7. Linux在高铁项目的部署环境

    因为Linux和Java像开源.所以,现在在server基本上使用部署Linux平台即server.然后部署项目.在开发项目的过程中.程序员绝大多数仍采用最经典windows操作系统,尽管Linux也 ...

  8. Tuxedo入门学�

    中间件介绍: 介于客户机和server之间的夹层,突破了传统的c/s架构,为构建大规模,高性能,分布式c/s应用程序提供了通信,事物,安全,容错等基础服务,屏蔽了底层应用细节,应用程序不必从底层开发, ...

  9. 升级到cocos2d-x 2.0.2代码差异

    来自:http://www.cnblogs.com/TopWin/archive/2012/09/12/2682042.html 近期看cocos2d-x 2.0.2公布后升级了一下.升级后发现又出现 ...

  10. poj1163The Triangle(简单DP)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj ...