学习php设计模式 php实现备忘录模式(Memento)


Posted in PHP onDecember 09, 2015

一、意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样可以在以后把该对象的状态恢复到之前保存的状态。

二、备忘录模式结构图

学习php设计模式 php实现备忘录模式(Memento)

三、备忘录模式中主要角色
1、备忘录(Memento)角色:
存储发起人(Originator)对象的内部状态,而发起人根据需要决定备忘录存储发起人的哪些内部状态。
备忘录可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。
2、发起人(Originator)角色:
创建一个含有当前的内部状态的备忘录对象
使用备忘录对象存储其内部状态
3、负责人(Caretaker)角色:
负责保存备忘录对象,不检查备忘录对象的内容
四、备忘录模式的优点和缺点
备忘录模式的优点:
1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取。
2、简化了发起人(Originator)类。发起人(Originator)不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理它们所需要的这些状态的版本
3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
备忘录模式的缺点:
1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
2、当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否会很昂贵。
3、当发起人角色的状态改变的时候,有可能这个状态无效。
五、备忘录模式适用场景
1、必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
2、如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
六、备忘录模式与其它模式
1、命令模式(command模式):Command模式也可以用来恢复对象的状态,一般Command模式可以支持多级状态的回滚,Memento只是简单的恢复(快照)。在Command模式的每一个undo中,可以使用Memento来保存对象的状态。
2、迭代器模式(Iterator模式):备忘录可以用于迭代
七、备忘录模式PHP示例

<?php
/**
 * 发起人(Originator)角色
 */
class Originator {
 
  private $_state;
 
  public function __construct() {
    $this->_state = '';
  }
 
  /**
   * 创建备忘录
   * @return Memento 包含当前状态的备忘录对象
   */
  public function createMemento() {
    return new Memento($this->_state);
  }
 
  /**
   * 将发起人恢复到备忘录对象记录的状态上
   * @param Memento $memento
   */
  public function restoreMemento(Memento $memento) {
    $this->_state = $memento->getState();
  }
 
  public function setState($state) {
    $this->_state = $state;
  }
 
  public function getState() {
    return $this->_state;
  }
 
  /**
   * 测试用方法,显示状态
   */
  public function showState() {
    echo "Original Status:", $this->getState(), "<br />";
  }
 
}
 
/**
 * 备忘录(Memento)角色
 */
class Memento {
 
  private $_state;
 
  public function __construct($state) {
    $this->setState($state);
  }
 
  public function getState() {
    return $this->_state;
  }
 
  public function setState($state) {
    $this->_state = $state;
  }
 
}
 
/**
 * 负责人(Caretaker)角色
 */
class Caretaker {
 
  private $_memento;
 
  public function getMemento() {
    return $this->_memento;
  }
 
  public function setMemento(Memento $memento) {
    $this->_memento = $memento;
  }
 
}
 
/**
 * 客户端
 */
class Client {
 
  /**
   * Main program.
   */
  public static function main() {
 
    /* 创建目标对象 */
    $org = new Originator();
    $org->setState('open');
    $org->showState();
 
    /* 创建备忘 */
    $memento = $org->createMemento();
 
    /* 通过Caretaker保存此备忘 */
    $caretaker = new Caretaker();
    $caretaker->setMemento($memento);
 
    /* 改变目标对象的状态 */
    $org->setState('close');
    $org->showState();
 
    /* 还原操作 */
    $org->restoreMemento($caretaker->getMemento());
    $org->showState();
  }
 
}
 
Client::main();
?>

以上就是使用php实现备忘录模式的代码,还有一些关于备忘录模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
怎样去阅读一份php源代码
Aug 21 PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 PHP
php+mysql实现无限分类实例详解
Jan 15 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
Nov 05 PHP
PHP单态模式简单用法示例
Nov 16 PHP
PHP那些琐碎的知识点(整理)
May 20 PHP
php+ajax实现异步上传文件或图片功能
Jul 18 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
Jun 03 PHP
PHP实现单条sql执行多个数据的insert语句方法
Oct 11 PHP
PHP 枚举类型的管理与设计知识点总结
Feb 13 PHP
php 原生分页
Apr 01 PHP
学习php设计模式 php实现观察者模式(Observer)
Dec 09 #PHP
PHP判断手机是IOS还是Android
Dec 09 #PHP
PHP的Yii框架的常用日志操作总结
Dec 08 #PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
Dec 08 #PHP
thinkPHP中create方法与令牌验证实例浅析
Dec 08 #PHP
详解PHP的Yii框架中日志的相关配置及使用
Dec 08 #PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 #PHP
You might like
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
PHP6新特性分析
2016/03/03 PHP
PHP常用的三种设计模式汇总
2016/08/28 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
2019/04/10 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
jquery遍历input取得input的name
2009/04/27 Javascript
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
微信小程序 五星评分的实现实例
2017/08/04 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
python+django快速实现文件上传
2016/10/24 Python
使用python实现生成用户信息
2017/03/20 Python
python opencv之分水岭算法示例
2018/02/24 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
Python提取频域特征知识点浅析
2019/03/04 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
2020/03/20 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
销售人员个人求职信
2013/09/26 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
四年级语文教学反思
2016/03/03 职场文书
python实现会员信息管理系统(List)
2022/03/18 Python